917. 仅仅反转字母(Python)

题目

难度:★☆☆☆☆
类型:字符串

给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

提示
S.length <= 100
33 <= S[i].ASCIIcode <= 122
S 中不包含 \ or "

示例

示例 1
输入:"ab-cd"
输出:"dc-ba"

示例 2
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

示例 3
输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

解答

方案1:哈希表

我们使用字典记录每个字符所在的位置,然后找出所有字母字符的位置并组成列表,将该列表逆序更新原字典,相当于只在有字母的位置上做字符串逆序,使用更新后的字典构建字母逆序的字符串。

class Solution:
    def reverseOnlyLetters(self, S):
        """
        :param S: str
        :return: str
        """
        loc = {i: c for i, c in enumerate(S)}
        alpha = {i: c for i, c in loc.items() if c.isalpha()}
        reversed_alpha = {i: c for i, c in zip(reversed(list(alpha.keys())), alpha.values())}
        loc.update(reversed_alpha)
        return ''.join([loc[i] for i in range(len(S))])

方案2:双指针

我们定义左右指针,并初始化为字符串两端字符所在位置,然后两个指针逐渐向中间靠拢,当两个指针同时找到字母时,交换两指针处的字符,如果只有一个指针处是字母,那么另一个指针要继续移动,直到找到字母。循环控制条件是左指针不能到右指针右边。

class Solution:
    def reverseOnlyLetters(self, S):
        """
        :param S: str
        :return: str
        """

        S = list(S)
        left, right = 0, len(S)-1
        while left < right:
            if not S[left].isalpha():
                left += 1
            elif not S[right].isalpha():
                right -= 1
            else:
                S[left], S[right] = S[right], S[left]
                left += 1
                right -= 1
        return ''.join(S)

如有疑问或建议,欢迎评论区留言~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,132评论 0 10
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,751评论 0 2
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 4,780评论 0 1
  • 低音提琴是西洋弦乐器中的一种,也是现代交响乐队中弦乐组中发音最低的乐器。低音提琴与弦乐组中其他乐器(小提琴、中提琴...
    Gagu_阅读 5,161评论 0 0
  • 窗外东风划春枝,沙沙地。 月光静静的,笼罩大地。 仿佛是你,却又不敢判断,相隔千里,词句里的愁,关于你。 太晚了,...
    未想到合适的名字阅读 3,122评论 1 4