/**
* 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置 如果j = -1,或者当前字符匹配成功(即S[i] ==
* P[j]),都令i++,j++,继续匹配下一个字符; 如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j =
* next[j],此举意味着模式串P相对于文本串S向右移动了至少1位(换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 -
* 失配字符对应的next 值,即移动的实际位数为:j - next[j],且此值大于等于1)。
*
* @author tina
*
*/
public class KMP { char[] s;
char[] p;
int[] next; public KMP(String s, String p) {
this.s = s.toCharArray();
this.p = p.toCharArray();
this.next = new int[this.p.length];
getNext();
for(int i=0;i<next.length;i++)
System.out.print(next[i]+" ");
} /**
* 填充next数组 若pattern[k] == pattern[j],则next[j + 1 ] = next [j] + 1 = k + 1;
* 若pattern[k ] ≠ pattern[j],如果此时pattern[ next[k] ] == pattern[j ],则next[ j
* + 1 ] = next[k] + 1,否则重复此过程。 现在前缀“p0 pk-1 pk” 去跟后缀 “pj-k pj-1
* pj”匹配,发现在pk处匹配失败,那么前缀需要向右移动多少位呢?根据已经求得的前缀各个字符的next 值,可得前缀应该向右移动k -
* next[k]位,相当于k = next[k]。 若移动之后,pk' = pj,则代表字符E前存在长度为next[ k' ] +
* 1的相同前缀后缀; 否则继续递归k = next [k],直到pk’’ 跟pj匹配成功,或者不存在任何k(0 < k < j)满足pk = pj
* ,且 k = next[k] = -1停止递归。
*/
public void getNext() {
next[0] = -1;
int j = 0;
int k = -1;
while (j < p.length - 1) {
if (k == -1 || p[k] == p[j]) {
k++;
j++;
next[j] = k;
} else {
k = next[k];
}
}
} public int match(){
int i=0;
int j=0;
while(i<s.length&&j<p.length){
if(j==-1||s[i]==p[j]){
i++;
j++;
}else {
j=next[j];
}
}
if(j==p.length){
return i-j;
}
else
return -1;
} public static void main(String[] args) {
String s="BBC ABCDAB ABCDABCDABDE";
String p="ABCDABD";
KMP k=new KMP(s, p);
System.out.println();
System.out.println(k.match()); }
}

最新文章

  1. SQL Server 【附】创建&quot;商品管理数据库&quot;、&quot;学生选课数据库&quot;的SQL语句
  2. Linux系统性能统计工具Sar和实时系统性能监控脚本
  3. CSS3动画属性之Animation
  4. C#读写文本和连接数据库
  5. Java7编程高手进阶读书笔记&mdash;集合框架
  6. Codeforces Round #340 (Div. 2) B. Chocolate 水题
  7. poj 2154 Color
  8. Bzoj 2431 HAOI2009 逆序对数列
  9. 修炼dp(1)
  10. Angular4.0.0发布总览文章
  11. Redhat 安装ftp服务
  12. POJ1083 Moving Tables(模拟)
  13. MySQL正则表达式初步
  14. 从QA到工程能效团队
  15. C++STL模板库适配器之stack容器
  16. jsp四大作用域
  17. SGD、GD
  18. Log4Net配置日志
  19. Reading | 《DEEP LEARNING》
  20. docker配置仓储库时出错:无法安全地用该源进行更新,所以默认禁用该源

热门文章

  1. shell字符串
  2. Live555类结构
  3. Add and Search Word - Data structure design 解答
  4. 剑指offer-面试题21.包含min函数的栈
  5. hdu 2896 病毒侵袭_ac自动机
  6. ※数据结构※→☆非线性结构(tree)☆============二叉树 顺序存储结构(tree binary sequence)(十九)
  7. Unity 获取服务器时间 HTTP请求方式
  8. 【Oracle】删除重复记录
  9. Lua多重继承
  10. 四、Mp3文件类型及其判断