首先理解kmp演算法,kmp演算法**如下:
from typing import *
def getnext(substr):
"""該函式的核心為構建next陣列,該陣列表示的是模式串開頭有多少個和
當前位置之前字元匹配
比如模式串為abcabc
next陣列為:[0,0,0,1,2,3]
:param substr:
:return:
"""idx, m = 0, len(substr)
pnext = [0] * m
i = 1
while i < m:
if substr[i] == substr[idx]:
pnext[i] = idx + 1
idx += 1
i += 1
else:
if idx != 0:
idx = pnext[idx - 1]
else:
pnext[i] = 0
i += 1
return pnext
def kmp(s: str, t: str):
pnext = getnext(t)
print(pnext)
m, n = len(t), len(s)
i, j = 0, 0
while i < n and j < m:
if s[i] == t[j]:
i += 1
j += 1
else:
if j != 0:
j = pnext[j - 1]
else:
i += 1
if j == m:
return i - j
return -1
該題解法:
class solution:
def repeatedsubstringpattern(self, s: str) -> bool:
pnext = self.getnext(s)
print(pnext)
len1 = len(s)
return pnext[len1 - 1] != 0 and len1 % (len1 - pnext[len1 - 1]) == 0
def getnext(self,substr):
idx, m = 0, len(substr)
pnext = [0] * m
i = 1
while i < m:
if substr[i] == substr[idx]:
pnext[i] = idx + 1
idx += 1
i += 1
else:
if idx != 0:
idx = pnext[idx - 1]
else:
pnext[i] = 0
i += 1
return pnext
leetcode 459 重複的子字串
一 問題描述 給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。示例 1 輸入 abab 輸出 true 解釋 可由子字串 ab 重複兩次構成。示例 2 輸入 aba 輸出 false 示例 3 輸入 abcabcabcabc 輸出...
Leetcode 459 重複的子字串
給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。示例 1 輸入 abab 輸出 true解釋 可由子字串 ab 重複兩次構成。示例 2 輸入 aba 輸出 false示例 3 輸入 abcabcabcabc 輸出 true解釋 可...
LeetCode 459 重複的子字串
題目描述 給定乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。給定的字串只含有小寫英文本母,並且長度不超過10000。輸入樣例1 輸入 abab 輸出 true 解釋 可由子字串 ab 重複兩次構成。輸入樣例2 輸入 aba 輸出 false 輸入樣例3 輸入 abcabcabcabc 輸...