谁能深入浅出的讲讲KMP算法?好难懂啊
几个月了,我好没搞懂!
[解决办法]
是不是next数组的初始化看不太明白?
其实next数组的初始化和后边的模式串与目标串的比对方式是一样的
在初始化next的时候可以把已初始化的看成是模式串,把未初始化的看成是目标串
貌似我越说越乱了
[解决办法]
鄙人语言能力很差,还是给个代码算了
public static int kmp(String tarStr, String matStr) { char[] tar = tarStr.ToCharArray(); char[] mat = matStr.ToCharArray(); int[] arr = new int[matStr.Length]; arr[0] = -1; int i_arr = 0; int j_arr = -1; while (i_arr < arr.Length - 1) { if (j_arr == -1 || mat[i_arr] == mat[j_arr]) { if (mat[++i_arr] != mat[++j_arr]) { arr[i_arr] = j_arr; } else { arr[i_arr] = arr[j_arr]; } } else { j_arr = arr[j_arr]; } } int i = 0; int j = 0; while (i < tar.Length && j < mat.Length) { if (j == -1 || tar[i] == mat[j]) { i++; j++; } else { j = arr[j]; } } if (j == mat.Length) return i - mat.Length; return -1; }
[解决办法]
next为当前不匹配时,
移动的最大距离!
[解决办法]
希望这个对你有用:六之再续:KMP算法之总结篇(必懂KMP)
http://blog.csdn.net/v_july_v/article/details/7041827
/* "n" "a" "o" other"" "n" "" "" """n" "n" "na" "" """na" "nan" "" "" """nan" "n" "na" "nano" """nano" "nano" "nano" "nano" "nano"*/
[解决办法]
我的注释我能看懂,至于你能不能看懂,就不得而知了
// 设置next数组的值 private void setNextSequence() { int len = this.strMode.length(); this.next = new int[len];// 初始化next数组 // 当模式串的首字符失配时,是一种特殊情况,主串此时需要右移一个位置,此处用-1标记这一特殊情况 this.next[0] = -1; this.next[1] = 0; for (int i = 1, j = 0; i < len - 1;) {// 每轮循环计算的是next[i+1]的值 if (j == -1) {// 没找到与next[i]相等的 前缀,连首字符都失配了 this.next[++i] = 0; j = 0; } else if (this.strMode.charAt(i) == this.strMode.charAt(j)) { this.next[++i] = ++j; } else { j = this.next[j];// 始终记录着next[i]的值 } } }