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