這兩天研究了一下字串中常見的兩種演算法。
kmp演算法:求子串在主串中的位置,主要參考大佬的演算法講解,整個演算法主要包括next陣列的求法和kmp找子串在主串中的位置。相比於樸素字串匹配需要不停的回溯來進行字元匹配,kmp只需要遍歷主串一次,時間複雜度為o(m+n) ,m、n分別為子串和主串長度。
演算法python實現如下:
def
normal
(a,b)
:#樸素字串匹配,主串需要回溯
i =0 j =
0while i <
len(a)
:if j ==
len(b)
:break
if a[i]
== b[j]
: i +=
1 j +=
1else
: j =
0 i = i - j +
1if j ==
len(b)
:return i-j
else
:return-1
defgene_next
(p):
#next陣列的實現
next=[
0for i in
range
(len
(p)+1)
]next[0
]=-1
j =-1
i =0while i <
len(p)
:if j ==-1
or p[i]
== p[j]
: i +=
1 j +=
1next
[i]= j
else
: j =
next
[j]return
next
defkmp
(a,b)
: l = gene_next(b)
i =0 j =
0while i <
len(a)
and j <
len(b)
:if a[i]
== b[j]
or j ==-1
: i +=
1 j +=
1else
: j = l[j]
if j ==
len(b)
:return i-j
else
:return-1
while
true
:try
: a =
input()
.strip(
'\n'
).strip('')
b =input()
.strip(
'\n'
).strip('')
print
('location:'
, normal(a,b)
)print
('location:'
, kmp(a,b)
)except
:break
manacher演算法:用於求乙個字串中最長回文子串長度,具體演算法詳解參考大佬講解,主要用到對稱思想。由於該演算法只不斷向後擴充套件最右回文邊界,不發生回溯,所以該演算法時間複雜度應該為o(n)。
具體演算法實現如下:
def
pad(s)
:#對字串進行填充
l ='' l +=
'#'for i in s:
l += i
l +=
'#'print
(l)return l
defmxx
(s):
c =0 max_r =-1
p =[0
for i in
range
(len
(s))
]for i in
range
(len
(s))
:if i < max_r:
p[i]
=min
(p[2
*c-i]
,max_r-i+1)
else
: p[i]=1
while
(i-p[i]
>=0)
and(i+p[i]
<
len(s)
)and s[i-p[i]
]== s[i+p[i]]:
p[i]+=1
if i + p[i]
>max_r:
c= i
max_r = i + p[i]-1
return
max(p)-1
if __name__ ==
'__main__'
:while
true
:try
: s =
input()
.strip(
'\n'
).strip(
' ')
s = pad(s)
print
(mxx(s)
)except
:break
#時間複雜度為o(n^2)的最長回文子串長度求法
defmaxx
(a):
if a == a[::
-1]:
return
len(a)
else
: maxlen =
0for i in
range
(len
(a))
: low = i
high = i+
1while low >=
0and high <
len(a)
and a[low]
== a[high]
:#對應abba型
low -=
1 high +=
1if high - low -
1> maxlen:
maxlen = high - low -
1 low = i -
1 high = i +
1while low >=
0and high <
len(a)
and a[low]
== a[high]
:# 對應aba型
low -=
1 high +=
1if high - low -
1> maxlen:
maxlen = high - low -
1return maxlen
字串 演算法總結
1.字串的複製 char scopy char str1,const char str2 int main char scopy char str1,const char str2 str1 j 0 return str1 2.字串的回文 判斷字串是否是回文 include include usin...
字串演算法總結
易犯錯誤 1 a c a 輸入的是大寫 a c減成了小寫 a 導致陣列的下標越界,程式執行時發生段錯誤 2 由字串轉換為數字時只有當字元是一位的時候才可以直接 0 如 11 就不可以直接 0 3 由數字轉化為字串時也要注意是否是一位的,如11就不可以直接用 0 轉化 4 審題不細,漏輸出,漏條件 問...
字串演算法總結 模板
目錄 kmp模式匹配演算法 manacher最長回文子串演算法 給出長度n的主串和長度m的模式串進行模式匹配,複雜度o n m 預處理出失敗指標 最長公共前字尾 進行平攤為o 1 的轉移 int nxt maxn void build next char s if s j 1 s i nxt i j...