kmp法の勉強をしている中で、以下のコードをサンプルとして参考にしました。
python
1 2def kmp_macth(txt: str, pat: str) -> int: 3 # skip_tableの作成 4 pt = 1 # 照合対象のインデックスをなぞるカーソル 5 pp = 0 # 照合したいパターンをなぞるカーソル 6 skip = [0] * (len(pat)+ 1) 7 8 skip[pt] = 0 9 while pt != len(pat): 10 if txt[pt] == pat[pp]: 11 skip[pt] == pp + 1 12 pt += 1 13 pp += 1 14 elif pp == 0: 15 skip[pt] = 0 16 pt += 1 17 else: 18 pp = skip[pp] ##### 19 20 # ここから一致文字列の探索 21 pt = 0 22 pp = 0 23 while pt != len(txt) and pp != len(pat): 24 if txt[pt] == pat[pp]: 25 pt += 1 26 pp += 1 27 elif pp == 0: 28 pt += 1 29 else: 30 pp = skip[pp] ##### 31 32 return pt - pp if pp == len(pat) else -1 33 34if __name__ == "__main__": 35 s1 = input("テキスト:") 36 s2 = input("パターン:") 37 38 idx = kmp_macth(s1, s2) 39 40 if idx == -1: 41 print("テキスト中にパターンは存在しない") 42 else: 43 print(f'{(idx + 1)}文字目にマッチ')
このコードの#####の箇所ですが、パターンのカーソルを更新していることはわかります。
しかし、どちらも常に
pp = 0
になるのではないでしょうか。このコードでは、テーブルの作成・一致文字列の探索どちらにおいても、#####の箇所は、パターンの先頭からの照合をすることになるように思えてなりません。
参考書のサンプルコードなので、自分が間違っているのだろうと思い、pp = 0ではうまくいかないケースを探すのですがうまく見つかりません。
どなたか、pp = skip[pp]でないと上手くいかないケースを教えていただけないでしょうか。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/29 21:15