字符串part02
● 151.翻转字符串里的单词
● 28. 实现 strStr()
● 459.重复的子字符串
● 字符串总结
● 双指针回顾
今日任务
151.翻转字符串里的单词

第一次写逻辑比较混乱,尤其难以处理第一个单词,重新整理一下逻辑:
当然是想找到两个指针fast和slow,让他们囊括住一个单词,然后给一个新的列表加上去。让fast指针从末端开始走,遇到空格就先掠过,直到来到一个单词末尾,注意保持该指针大于等于0,防止走出去了。
找到单词末尾并留下一个slow在原地,然后继续向前直到来到空格,此时[fast+1: slow+1]也即找到一个单词,加到列表中。最后把整个列表按照空格链接成字符串。避免了对于第一个单词的讨论。
python
class Solution:
def reverseWords(self, s: str) -> str:
new_s = []
length = len(s)-1
fast = length
while fast>=0:
while fast>=0 and s[fast] == ' ':
fast -= 1
if fast < 0:
break
slow = fast
while fast>=0 and s[fast] != ' ':
fast -= 1
word = s[fast+1: slow+1]
new_s.append(word)
return ' '.join(new_s)
使用 .split 方法比较容易
語法
str.split(sep=None, maxsplit=-1)
sep:分隔符號,預設為 None(空白字元)maxsplit:最大分割次數,-1 表示無限制使用空白分割(預設)
當不指定分隔符號時,會以任意空白字元分割,並自動忽略多餘的空白:
text = "Hello World Python" result = text.split() print(result) # ['Hello', 'World', 'Python'] # 包含換行和 Tab text = "Hello\nWorld\tPython" result = text.split() print(result) # ['Hello', 'World', 'Python']
使用split可以自动去空白,把所有的单词存储到列表里,交换头和尾的单词即可
python
class Solution:
def reverseWords(self, s: str) -> str:
new_s = list(s.split())
left = 0
right = len(new_s)-1
while left <= right:
new_s[left], new_s[right] = new_s[right], new_s[left]
left += 1
right -= 1
return ' '.join(new_s)
右旋字符串

知道python的好了,无敌了,使用列表和库函数狠狠操作字符串
python
k = int(input())
s = input()
new_s = ''
spin1 = s[0: len(s)-k]
spin2 = s[len(s)-k: len(s)]
new_s = str(spin2)+str(spin1)
print(new_s)
28. 实现 strStr()

感觉使用python时大脑皮层的褶皱都抚平了,没有烧脑的勾心斗角,没有复杂的边界判断。只有清晰的字符串切片和舒适的函数调用。
python
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
n_length = len(needle)
left = 0
right = 0+n_length
while right<= len(haystack):
if str(haystack[left:right]) == needle:
return left
else:
left += 1
right += 1
return -1
当然,很重要的方法还是要学习的。
459.重复的子字符串

天才
python
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
return s in (s+s)[1:-1]