文章链接:代码随想录
151.翻转字符串里的单词 + 卡码网:55.右旋转字符串
视频链接:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili
一刷先跳过KMP算法了,先把字符串的其他基础题过一遍。
总体来说,由于python字符串处理特性和一些库函数的存在,用python做字符串题的难度要小于讲解中的C++。但是重要的是掌握解题思路,注意写代码时的逻辑细节问题。
另外,需要再次强调的是:在Python中字符串是不可变的,不能像操作列表或字典那样,直接对字符串的某个位置上的字符进行赋值。例如,反转字符串类的题目需要将其转换成列表,然后通过join()函数再将其转换成列表,因此无法实现空间复杂度为O(1)的要求。
151.翻转字符串里的单词
状态:有思路,同时看了视频讲解,理解了按照要求“不要使用辅助空间,空间复杂度要求为O(1)”的情况下该如何解题
思路:
按照“拆分-反转-合并”的思路来做:
1)拆分可直接使用split()函数,在此过程中直接将字符串中多余空格的问题一并处理了
2)反转可以直接用切片,也可以用双指针法分别从头尾两端进行单词的前后替换
3)合并就是用 “(一个空格)”.join()实现
总结:
1. 看文字讲解中的另一种思路是:先删除空白,然后整个反转,最后单词反转。首先删除字符串的前后空白,用的是strip()函数;整个反转使用的是切片;单词反转是将反转后的字符串进行split()拆分再反转单词
2. 要求“不要使用辅助空间,空间复杂度要求为O(1)”时的解题思路(参考代码随想录文字讲解):
- 移除多余空格 ==>>类似数组中的“移除元素”解法,快慢指针思想
- 将整个字符串反转 ==>> 同leetcode344 reverse()函数双指针思想,从头尾两端进行字符反转
- 将每个单词反转 ==>> 还是reverse()函数,遇到空格说明单词结束
3. 时间复杂度O(n), 空间复杂度O(n)
class Solution:
def reverseWords(self, s: str) -> str:
lst = s.split()
# 双指针思想,也可直接使用切片lst[::-1]
left, right = 0, len(lst) - 1
while left < right:
lst[left], lst[right] = lst[right], lst[left]
left += 1
right -= 1
return ' '.join(lst)
卡码网:55.右旋转字符串
状态&思路:按照python的写法,直接使用切片即可
总结:
1. 要求“不能申请额外空间,只能在本串上操作”的思路,移步==>>右旋字符串 | 代码随想录
k = int(input())
s = input()
s = s[len(s)-k:] + s[:len(s)-k]
print(s)