KMP算法的作用在于在一个主串中查找一个主串。

传统查找子串的方法是一个字符一个字符的比较,代码如下:

 public static int notKMP(String main,String sub){

        for (int i=;i<main.length();i++){
int j=;
int k=i;
while (main.charAt(k)==sub.charAt(j)){
k++;
j++;
if (j==sub.length()){
return i;
}
}
}
return -; }

这种方式在遇到不相同的时候,主串往下移动一位,子串恢复到0.继续的进行对比。

KMP的算法的有点在于子串中如果有相同的部分的话,那么可以省略一部分的校验,下面这个图加深一些印象:

如果我们使用KMP算法的话,那么中间的红框的那部分是不需要比较的,很显而易见,因为他们都第一步进行了比较了,当然怎么判断还是需要算法的。

算法的步骤分为两部分,第一部分是算出子串的next数组,这个数组表达的就是子串的相似度,具体算法实现:

 /**
* 返回KMP数组
* @param str
* @return
*/
public static int[] getNextArr(String str){
int[] nexts=new int[str.length()];
//j=1 的时候为0 j=2的时候为1
nexts[]=;
nexts[]=;
for (int j=;j<str.length();j++){
int index=;
for (int i=;i<j-;i++){
if(str.substring(,i+).equals(str.substring(j-i-,j))){
index++;
}
}
nexts[j]=index;
}
return nexts;
}

第二部分就是进行匹配:

 /**
*
* @param s 主串
* @param t 子串
* @param pos 从主串哪个位置开始匹配
* @return
*/
public static int indexKMP(String s,String t,int pos){
int i=pos;
int j=;
int[] nexts=getNextArr(t);
while (i<s.length()&&j<t.length()){
if (j==||s.charAt(i)==t.charAt(j)){
i++;
j++;
}else {
j=nexts[j-];
}
} if (j>=t.length()){
return i-t.length();
}
return ;
}

. 总的来讲就是只关注子串,出现相同的那部分可以不进行比较。

最新文章

  1. QT数据库连接的几个重要函数的使用及注意事项(原创)
  2. WCF 客户端代理生成 通过SvcUtil.exe
  3. JavaScript中with语句的理解
  4. 为Visual Studio更换皮肤和背景图
  5. hessian入门
  6. MVC中的奇葩错误,参数转对象
  7. ecshop二次开发 给商品添加自定义字段
  8. 学习java随笔第一篇:搭建java平台(java se)
  9. mysql 数据库连接(远程和本地原理同样)
  10. fdm_search_info_w_book_chain
  11. 初始化一个本地GIT仓储
  12. 选择、冒泡排序,二分查找法以及一些for循环的灵活运用
  13. 有道云翻译接口 Show类
  14. 概括一下nodejs
  15. 实现Windows数据绑定
  16. Jenkins通过Publish over SSH插件实现远程部署
  17. Spring配置之标签的三两事
  18. 使用应用链接来连接 Jira 和 Confluence 6
  19. elementui command绑定变量对象方法
  20. win7 64位安装Dlib19.6版本的过程记录

热门文章

  1. 正则表达式零宽断言详解(?=,?&lt;=,?!,?&lt;!)
  2. 几个例子弄懂JS 的setTimeout的运行方式
  3. django之模版层(template)
  4. Unity项目中文字的统一管理
  5. Gcode命令【转】
  6. python pip 安装包报 编码问题
  7. Java 设计模式专栏
  8. 应用间共享文件 FileProvider
  9. php位运算 与 或 异或 取反
  10. Git入门到高级系列2-git高级操作