题解采用双指针技术,分别从字符串的首尾开始遍历。左指针left从前向后移动,右指针right从后向前移动。如果左指针指向的字符不是字母,则将该字符直接复制到结果中并移动左指针。如果右指针指向的字符不是字母,则将该字符直接复制到结果中并移动右指针。当左右指针均指向字母时,将它们的位置互换,即将右指针的字母放到左指针的位置,左指针的字母放到右指针的位置,然后同时移动两个指针。这个过程一直进行,直到left大于right为止。最后,将结果数组转换为字符串形式返回。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def reverseOnlyLetters(self, s: str) -> str:
s_list = list(s) # 将字符串转换为列表以便修改
reversed_string = [''] * len(s) # 创建一个与原字符串等长的空字符列表
left, right = 0, len(s) - 1 # 初始化左右指针
while left <= right:
if not s[left].isalpha(): # 左指针指向非字母
reversed_string[left] = s[left]
left += 1 # 移动左指针
elif not s[right].isalpha(): # 右指针指向非字母
reversed_string[right] = s[right]
right -= 1 # 移动右指针
else:
# 交换左右指针指向的字母
reversed_string[left], reversed_string[right] = s[right], s[left]
left += 1 # 同时移动左右指针
right -= 1
return ''.join(reversed_string) # 将列表转换回字符串并返回