

可以使用双指针方法来解决这个问题。以下是 Python 代码实现:
def reverseOnlyLetters(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)
# 测试
print(reverseOnlyLetters("a-bC-dEf-ghIj")) # 输出 "j-Ih-gfE-dCba"
print(reverseOnlyLetters("Test1ng-Leet=code-Q!")) # 输出 "Qedo1ct-eeLg=ntse-T!"
代码解析:
-
转换为列表:字符串在 Python 中是不可变的,因此先转换为列表以便进行交换操作。
-
使用双指针:
-
left指向字符串开头,right指向字符串结尾。 -
如果
left不是字母,则left向右移动。 -
如果
right不是字母,则right向左移动。 -
如果两者都是字母,则交换,并向中间靠拢。
-
-
返回结果:最终将列表拼接成字符串返回。
该算法的时间复杂度为 O(n),空间复杂度为 O(n)(主要是字符串转换为列表的额外空间)。
561

被折叠的 条评论
为什么被折叠?



