151.翻转字符串里的单词
这个题不难,但是我搞了一会,主要是.split()函数不熟悉,代码如下所示
class Solution:
def reverseWords(self, s: str) -> str:
arr = s.split()
arr.reverse()
return " ".join(arr)
右旋字符串
k = int(input())
s = input()
s = s[len(s)-k:] + s[:len(s)-k]# 1.获取从倒数第 k 个字符到最后的所有字符。2. 获取从第一个字符到倒数第 k+1 个字符的所有字符。
print(s)
这道题python做起来可以直接用列表切片来做,但是要很熟练才行,重点在于:
代码中的这两行是对字符串 s
进行切片操作,并将两部分重新组合起来以达到反转字符串的效果:
s[len(s)-k:]
获取从倒数第k
个字符到最后的所有字符。s[:len(s)-k]
获取从第一个字符到倒数第k+1
个字符的所有字符。
之后,将这两部分连接起来形成一个新的字符串。
这里的关键在于理解 Python 中的切片语法。对于一个序列 x[start:stop]
,如果省略了 start
,那么默认从序列的开始位置取值;如果省略了 stop
,则一直取到序列的末尾。
28. 实现 strStr()
这道题是KMP算法,KMP算法当时自学的时候很难搞懂,只知道是查找子串的一个算法,这回也没太搞懂多少直接就用了……
class Solution:
def getNext(self, next, s):
j = -1
next[0] = j
for i in range(1, len(s)):
while j >= 0 and s[i] != s[j+1]:
j = next[j]
if s[i] == s[j+1]:
j += 1
next[i] = j
def strStr(self, haystack, needle):
if not needle:
return 0
next = [0] * len(needle)
self.getNext(next, needle)
j = -1
for i in range(len(haystack)):
while j >= 0 and haystack[i] != needle[j+1]:
j = next[j]
if haystack[i] == needle[j+1]:
j += 1
if j == len(needle) - 1:
return i - len(needle) + 1
return -1
459.重复的子字符串
class Solution(object):
def repeatedSubstringPattern(self, s):
n = len(s)
if n <= 1:
return False
ss = s[1:] + s[:-1]
return ss.find(s) != -1
我决定代码要实用主义了,能跑起来就行,最近太忙没空学KMP算法,只能先搞懂这几个切片操作了:
s[1:]
表示从s
的第二个字符到最后一个字符的子串。s[:-1]
表示从s
的第一个字符到倒数第二个字符的子串。
然后将这两部分拼接在一起形成 ss
。这样做的目的是为了创建一个循环版本的 s
,使得开头和结尾相邻,可以检测是否有重复的模式。
判断 s
是否存在于 ss
中。如果 s
存在于 ss
中且不是 -1
,则说明 s
可能是由一个更短的子串重复组成的,返回 True
;否则返回 False
。