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