背景
匹配字符串,并返回可以匹配到的第一个开始的字符串。leetcode题目28
https://leetcode-cn.com/problems/implement-strstr/solution/shua-chuan-lc-shuang-bai-po-su-jie-fa-km-tb86/
解题思路
先构造好前缀表,然后不相等则退回到前缀表中值的索引位置。例如被匹配的字符串为"ababc", 则构造前缀表为:
前缀串 | 值 |
---|---|
a | 0 |
ab | 0 |
aba | 1 |
abab | 2 |
ababc | 0 |
表示"ababc"的所有前缀,对每个前缀找出最长公共前后缀。当作前缀表。最长前缀和最长后缀想等。
在正式使用时,使用下表,即开头加-1,最后一个去掉。
前缀串 | 值 |
---|---|
-1 | |
a | 0 |
ab | 0 |
aba | 1 |
abab | 2 |
代码
在下面的程序中,getnexts被用来构造前缀表:
class Solution(object):
def strStr(self, haystack, needle):
a=len(needle)
b=len(haystack)
if a==0:
return 0
i=j=0
nexts=self.getnexts(a,needle)
while(i<b and j<a):
if j==-1 or needle[j]==haystack[i]:
i+=1
j+=1
else:
j=nexts[j]
if j==a:
return i-j
else:
return -1
def getnexts(self,a,needle):
nexts=['' for i in range(a+1)]
j = 0
k = -1
nexts[0]=k
while(j<a):
print("############")
print("k",k,"j",j)
if k==-1 or needle[k]==needle[j]:
print("execute a")
k+=1
j+=1
nexts[j]=k
else:
print("execute b")
k=nexts[k]
print("k",k,"j",j)
print("nexts",nexts)
print("nexts",nexts)
return nexts
sol = Solution()
res = sol.strStr("abaacababcac", "ababc")
print("res", res)
相关资料
youtube,讲解详细
https://www.youtube.com/watch?v=dgPabAsTFa8