大家好,我是 @负雪明烛。👈👈 点击关注,优质题解不间断。
题目大意
对字符串进行逆序,要求只把字母的顺序翻转,而其他字符原地不动。
解题方法
栈
看到逆序,有没有想到栈?栈是一种「先进后出」的数据结构,因此可以实现逆序。
- 先把所有的字母保存到栈中;
- 遍历字符串
S
,当前遍历到 $i$ 位置:- 如果 $S[i]$ 是字母,则往结果字符串中添加栈顶元素
- 否则,添加 $S[i]$
class Solution(object):
def reverseOnlyLetters(self, S):
"""
:type S: str
:rtype: str
"""
letters = []
N = len(S)
for i, s in enumerate(S):
if s.isalpha():
letters.append(s)
res = ""
for i, s in enumerate(S):
if s.isalpha():
res += letters.pop()
else:
res += s
return res
复杂度分析:
其实这道题标准的解法是双指针。
- 使用两个指针 $left$ 和 $right$ 分别指向前面和后面的两个字母,非字母就跳过。
- 然后将两个字母交换位置。
- 当 $left >= right$ 时,结束。
这个做法需要注意,需要始终满足 $left >= right$,因此在 while
和 if
中都做了判断。
class Solution(object):
def reverseOnlyLetters(self, S):
"""
:type S: str
:rtype: str
"""
N = len(S)
left, right = 0, N - 1
slist = list(S)
while left < right:
while left < right and (not S[left].isalpha()):
left += 1
while right >= left and (not S[right].isalpha()):
right -= 1
if left < right:
slist[left], slist[right] = slist[right], slist[left]
left, right = left + 1, right - 1
return "".join(slist)
时间复杂度:
- 时间复杂度:
,其中
是数组长度;
- 空间复杂度:
#card=math&code=O%281%29&id=Pz3XE)
总结
- 栈的做法用到了额外空间,双指针做法是在原地修改。
- 属于经典的双指针题目了,希望对你有帮助。
我是 @负雪明烛 ,刷算法题 1000 多道,写了 1000 多篇算法题解,收获阅读量 300 万。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。
- 在刷题的时候,如果你不知道该怎么刷题,可以看 LeetCode 应该怎么刷?
- 如果你觉得题目太多,想在短时间内快速提高,可以看 LeetCode 最经典的 100 道题。
- 送你一份刷题的代码模板:【LeetCode】代码模板,刷题必会