大家好,我是 @负雪明烛。👈👈 点击关注,优质题解不间断。
题目大意
对字符串进行逆序,要求只把字母的顺序翻转,而其他字符原地不动。
解题方法
栈
看到逆序,有没有想到栈?栈是一种「先进后出」的数据结构,因此可以实现逆序。
- 先把所有的字母保存到栈中;
- 遍历字符串
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 += sreturn 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 - 1slist = list(S)while left < right:while left < right and (not S[left].isalpha()):left += 1while right >= left and (not S[right].isalpha()):right -= 1if left < right:slist[left], slist[right] = slist[right], slist[left]left, right = left + 1, right - 1return "".join(slist)
时间复杂度:
- 时间复杂度:
,其中
是数组长度;
- 空间复杂度:
#card=math&code=O%281%29&id=Pz3XE)
总结
- 栈的做法用到了额外空间,双指针做法是在原地修改。
- 属于经典的双指针题目了,希望对你有帮助。
我是 @负雪明烛 ,刷算法题 1000 多道,写了 1000 多篇算法题解,收获阅读量 300 万。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。
- 在刷题的时候,如果你不知道该怎么刷题,可以看 LeetCode 应该怎么刷?
- 如果你觉得题目太多,想在短时间内快速提高,可以看 LeetCode 最经典的 100 道题。
- 送你一份刷题的代码模板:【LeetCode】代码模板,刷题必会
