讲解
● 28. 实现 strStr()
● 459.重复的子字符串
● 字符串总结
● 双指针回顾
题目链接:28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
示例 1:
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:
输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
题解:
暴力法:
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
lenh = len(haystack)
for i in range(lenh):
m = i
n = 0
lenn = len(needle)
if lenh<lenn:
break
while(lenn and i+lenn<=lenh):
if haystack[m] == needle[n]:
m += 1
n += 1
lenn -= 1
else:
break
if lenn == 0:
return i
return -1
时间复杂度:O(m*n)
KMP算法:(暂时跳过)
- KMP算法:KMP为发现此算法的三个人名字首字母
- KMP算法主要解决字符串匹配问题
题目链接:459. 重复的子字符串
移动匹配
当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的:
也就是由前后相同的子串组成。
那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个s,如图:
所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。
当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。
代码如下:
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
ss = s+s #将字符串重复拼接
ss = ss[1:-1] #去除拼接后的首位字符
if s in ss: #如果原字符串还在拼接且去除首位字符的字符串里,则可由子串重复构成
return True
else:
return False