leetcode_917 仅仅反转字母

105 阅读1分钟

要求

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

示例 1:

输入:"ab-cd"
输出:"dc-ba"

示例 2:

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

示例 3:

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

提示:

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

核心代码

class Solution:
    def reverseOnlyLetters(self, s: str) -> 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))])

另一解法

class Solution:
    def reverseOnlyLetters(self, s: str) -> 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)

image.png

解题思路:第一种解法:我们将字母和索引记录在一个字典中,然后我们将索引倒序后和原来的值组合在一起,在将字典更新到原始的字典中,在将列表拼成一个字符串就是反转之后的值;第二种解法:使用左右指针的方式,我们先将字符串变成一个列表,然后我们扫到左右都是字母的时候,我们将其进行调换,最后我们将列表在拼合成一个字符串即可。