1. KMP 算法(字符串匹配算法)较 BF(朴素的字符串匹配)算法有哪些改进

1) 在主串和子串匹配的过程中,主串不再回退,只改变子串的比较位置。

2) 为子串生成对应的next数组,每次匹配失败,通过访问next数组获知子串再一次开始匹配的位置。

2.  在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的

前缀。

因此KMP算法的思想就是:在匹配过程称,若发生不匹配的情况,如果next[j]>=0,则目标串的指针i不变,将模式串的指针j移动到next[j]的位置继续进行匹配;若next[j]=-1,则将i右移1位,并将j置0,继续进行比较。

public class KMP {
public static void main(String[] args) {
String a="aawsadabbb";
String b="abb";
System.out.println(KMP(a,b));
}
public static int KMP(String s,String t ){
int i=0;
int j=0;
int []next=getNext(t);
while (i<s.length()&&j<t.length()){
if(j==-1||s.charAt(i)==t.charAt(j)){
i++;j++;
}else {
j=next[j];
}
}
if(j==t.length()){
return i-j;
}else {
return -1;
}
}
// 求取next数组
private static int[] getNext(String t) {
int k=-1;
int j=0;
int []next=new int[t.length()];
next[0]=-1;
while (j<t.length()-1){
if(k==-1||t.charAt(k)==t.charAt(j)) {
k++;
j++;
next[j]=k;
}else {
k=next[k];
}
}
return next;
}
}

最新文章

  1. 【Qt】QDialog之屏蔽Esc键【转】
  2. Xcode8 重新配置 CocoaPods -替换阿里源
  3. 利用OllyDebug查看程序调用的dll模块
  4. 笨方法学python--简介
  5. c++ map unordered_map
  6. MyBatis:学习笔记(3)——关联查询
  7. [Android]Android焦点流程代码分析
  8. js_9_dom属性
  9. LeetCode33—搜索旋转排序数组
  10. 禁用ViewPager的滑动事件
  11. [Go] ok 判断 汇总
  12. Darknet卷基层浅层特征可视化教程
  13. java 多线程之 interrupt()和线程终止方式
  14. ubuntu 16.04 上opengl 的安装以及例子程序编译执行
  15. 【git】------git的基本介绍及linux的基本命令------【巷子】
  16. C# 调用颜色的RGB值_RGB颜色转换十六进制颜色
  17. 查看Unix/Linux的CPU个数和内存大小,系统位数(转载)
  18. Java入门系列-14-深入类和对象
  19. android精确绘制文字位置的方法
  20. [docker]一些经常或不经常用到的镜像启动方法-一些常用的docker启动方式

热门文章

  1. 【最新】docker 安装elasticsearch + kibana步骤【第一篇_elasticsearch】
  2. mysql-视图及索引简介
  3. Metrics介绍和Spring的集成(转)
  4. java des 加密/解密
  5. js基本算法
  6. git ,报403错误,完美解决方案
  7. NOIp2018集训test-10-20 (bike day6)
  8. HDU6333 求组合数前m项的和
  9. FM算法组合估计
  10. JAVA常用集合解析