————2020.1.17————
Posted zzl1209
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了————2020.1.17————相关的知识,希望对你有一定的参考价值。
# 算法 || KMP #
步骤:①寻找前缀后缀最长公共元素长度
②求next数组
③根据next数组进行匹配
失配时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值,即j - next[j]。
递推求next数组。
1 public static int[] getNext(String str) { 2 int[] next = new int[str.length()]; 3 next[0] = -1; 4 int i = 1, curMatch = 0; 5 while (i<str.length()-1) { 6 if (str.charAt(i) == str.charAt(curMatch)) { 7 next[i+1] = next[i] + 1; 8 curMatch++; 9 } else { 10 next[i+1] = 0; 11 curMatch = 0; 12 } 13 i++; 14 } 15 return next; 16 }
next数组与有限自动机。
next数组的优化。
KMP。
1 public static int KMP(String s, String t) { 2 int[] next = getNext(t); 3 int i = 0, j = 0; 4 while (i < s.length() && j<t.length()) { 5 if (j == -1 || s.charAt(i) == t.charAt(j)) 6 { 7 i++; 8 j++; 9 } 10 else 11 { 12 j = next[j]; 13 } 14 } 15 if (j == t.length()) 16 return i - j ; 17 else 18 return -1; 19 }
BM、Sunday算法等待补充。。
# Edit : 2020.1.17
以上是关于————2020.1.17————的主要内容,如果未能解决你的问题,请参考以下文章