Python は文字列に対して KMP アルゴリズムを実装します

零到壹度
リリース: 2018-04-19 16:20:40
オリジナル
1939 人が閲覧しました

この記事の例では、Python での文字列に対する KMP アルゴリズムの実装について説明します。参考までに共有します。詳細は次のとおりです。

KMP アルゴリズム Python 実装

今日は KMP アルゴリズムを勉強しました。さまざまな言語で書かれた多くのバージョンがあるようですが、読めば読むほど。と、ますますややこしくなってきました。 最後に、自分で書いてみました。 まとめ


まず、KMPアルゴリズムは、元のO(m*n)をO(に減らす、文字列マッチングの最適化アルゴリズムです。 m+n)

彼の理解のために、まずビデオを見ることをお勧めします。彼は非常にわかりやすく説明しました。誰でも理解できる KMP 文字列マッチング アルゴリズム
次に、KMP アルゴリズムをよりよく理解して習得する方法を確認することをお勧めします。 - Yuzi の答え - Zhihu Rong
コードからのパターン セットの検索を理解します。レベル 2 (KMP アルゴリズム)
他の人のコードを読みすぎないでください。私自身が問題に遭遇したときに、クラスメートが書いたコードを読んで、他のピットに連れて行かれました。 。 。 。
最後にコード re

'''
先求next数组
'''def next_list(pattern):
    next=[]
    pattern_list=list(pattern)
    j=0
    i=1
    for s in range(len(pattern)):        #第一位一直是0
        if s==0:
            next.append(0)        #看第i个和第j个字母是否相同,如果相同,则累加
        #同时i,j同时右移
        elif(pattern_list[i]==pattern_list[j]):           
            next.append(j+1)
            j+=1
            i+=1
        #如果不相同,则next为0,同时j也退回第一个位置,i继续前进一个位置
        else:
            next.append(0)
            j=0
            i=s+1
    print(next)    return next

next_list('ABABCABAB')      

def kmp(text,pattern):
    #text的位置
    i=0
    #pattern的位置
    j=0
    next=next_list(pattern)    if(not(text and pattern)):
        print(&#39;字符串为空,请输入字符串&#39;)    elif(len(text)<len(pattern)):
        print(&#39;原字符串过小&#39;)    elif(text==pattern):
        print(&#39;字符串一致&#39;)    else:        while( (i<len(text) )):
            print((text[i],pattern[j]))
            print(i,j)            #如果相同,则进行下一个对比
            if( text[i]==pattern[j]):
                i+=1
                j+=1
            #判断是不是匹配完了
            if j==len(pattern):
                print(&#39;从第{0}个位置开始匹配&#39;.format(i-j))
                j=next[j-1]            #如果不匹配,则j反回到前一个字母对应的next
            elif i<len(text) and text[i]!=pattern[j]:                #我就是少了这个判断,一直有问题,就是在不匹配后的第二步,后面这个很关键
                if j!=0:                #这个就是精髓了,如果不匹配,就去找第一个和这个匹配的字符串,然后在这个前面的匹配字符串
                #的后一个字母拿出来,再与长text比较的第i个字母比较
                    j=next[j-1]                #如果j已经回到了0,则通过增加i,text移动到下一个字母
                else:
                    i+=1# text = "ABABDABACDABABCABAB"# pattern = "ABABCABAB"            text=&#39;abxabcabcaby&#39;pattern=&#39;abcaby&#39;kmp(text,pattern)#output:next=[0, 0, 0, 1, 2, 0]


(&#39;a&#39;, &#39;a&#39;)
0 0
(&#39;b&#39;, &#39;b&#39;)
1 1
(&#39;x&#39;, &#39;a&#39;)
2 0
(&#39;a&#39;, &#39;a&#39;)
3 0
(&#39;b&#39;, &#39;b&#39;)
4 1
(&#39;c&#39;, &#39;c&#39;)
5 2
(&#39;a&#39;, &#39;a&#39;)
6 3
(&#39;b&#39;, &#39;b&#39;)
7 4
(&#39;c&#39;, &#39;c&#39;)
8 2
(&#39;a&#39;, &#39;a&#39;)
9 3
(&#39;b&#39;, &#39;b&#39;)
10 4
(&#39;y&#39;, &#39;y&#39;)
11 5
从第6个位置开始匹配
ログイン後にコピー
を記録します

関連する推奨事項:

KMP アルゴリズムは最も簡単に理解できます

KMP アルゴリズムの詳細

K で理解するのが最も難しいMP アルゴリズム

kmpアルゴリズムの原理と実装

KMPアルゴリズムの図解

以上がPython は文字列に対して KMP アルゴリズムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート