実現したいこと
下記のKMP法に利用するcompnxt関数のサンプルコードを修正したい。
参照:https://www.cgg.cs.tsukuba.ac.jp/~nishihara/Fig3_8+Ex3_A(p64).pdf
修正するのは、1-indexed担っている部分でこれを0-indexedにする。
前提
該当のソースコード(リンク先にあります。)
void compnxt(char pat) / 次照合位置 next[i]の計算 */
{ int i=1,s=0;
next[1]=s;
while (i < m) {
while (s > 0 && pat[i] != pat[s]) s=next[s];
if (pat[++i] == pat[++s]) next[i]=next[s];
else next[i]=s;
}
}
発生している問題・エラーメッセージ
期待している出力にならない。
例えば、patがAABであるならば、nextは[0,0,2]となるが、自分で修正した下記の該当のソースコードだと、異なった出力になる。
該当のソースコード
C
1#include <string.h>2#include "compnext.h"3 4void compnext(char* pat, int* next) {5 int patlen = strlen(pat);6 7 int i = 1, s = 0;8 next[0] = s;9 10 while (i < patlen) {11 while (s > 0 && pat[i - 1] != pat[s - 1]) {12 s = next[s - 1];13 }14 if (pat[i] == pat[s]) {15 next[i] = next[s];16 } else {17 s++;18 next[i] = s;19 }20 i++;21 }22}
試したこと
自分でサンプルコードを参照にして、実装(修正)した。
0 コメント