字串演算法總結 kmp mannacher演算法

2021-10-04 04:47:31 字數 3564 閱讀 4407

這兩天研究了一下字串中常見的兩種演算法。

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...