KMP算法
算法的背景
KMP 是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法
核心思想
KMP 方法算法就利用之前判断过信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置,省去了大量的计算时间。
算法图解:
当算法移动到上述位置时:(发生不匹配)
发现公共前后缀为A,于是移动公共前后缀到下面位置:
为什么能够保证移动时就不会出现再匹配的情况呢
因为这里可以采用反证的手段,如果在移动时出现匹配,则就说明公共前后缀与所确定的模式串的公共前后缀不同,这就产生矛盾了。
核心代码
求next数组(这里next数组表示模式串的公共前后缀个数)
//获取字符串的部分匹配值表
public static int[] kmpNext(String dest){
int[] next = new int[dest.length()];
next[0] = 0;
for (int i = 1, j = 0; i < dest.length(); i++) {//j可以代表匹配时的一个计算变量
if(dest.charAt(i) == dest.charAt(j)) {
j++;
}else{
j = next[j - 1];//如果出现匹配不成功则直接赋值0
}
next[i] = j;//找到i对应的j值,比如第一个字母A就是1,AB就是2
}
return next;
}
求KMP算法:
public static int kmpSearch(String str1,String str2,int[] next){
for (int i = 0,j = 0; i < str1.length(); i++) {//这里使用两个指针进行匹配
while(j > 0 && str1.charAt(i) != str2.charAt(j)){
j = next[j - 1];//这里是核心中的核心
}
if(str1.charAt(i) == str2.charAt(j)){
j++;//指针前移
}
if(j == str2.length()){
return i - j + 1;//这加个1是因为考虑到索引问题
}
}
return -1;
}
原文地址:http://www.cnblogs.com/robyn2022/p/16913210.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性