简介:
KMP 算法,俗称“看毛片”算法,是字符串匹配的一个算法.
代码示例:
import java.util.ArrayList;
public class KMP {
//主串
static String str = "1kk23789456789hahha";
//模式串
static String ch = "789";
static int next[] = new int[20];
public static void main(String[] args) {
setNext();
ArrayList<Integer> arr = getKmp();
if(arr.size()!=0) {
for(int i=0; i<arr.size(); i++) {
System.out.println("匹配发生在:"+arr.get(i));
}
}else {
System.out.println("匹配不成功");
}
}
private static void setNext() {
// TODO Auto-generated method stub
int lenCh = ch.length();
next[0] = 0;
next[1] = 1;
//k表示next[i-1]的值
int k = 0;
for(int i=2; i<=lenCh; i++) {
k = next[k];
/*
* 这个while循环的作用找个例子看看就好理解了
* 我认为是每次找最长,一旦成功就停止,保证找到的是当前最长
*/
while(k!=0 && ch.charAt(i-1)!=ch.charAt(k)) {
k = next[k];
}
if(ch.charAt(i-1)==ch.charAt(k)) {
k++;
}//else就是k=0
//不是next[k] = k,i表示有几个字符的前缀
next[i] = k;
}
}
private static ArrayList<Integer> getKmp() {
// TODO Auto-generated method stub
ArrayList<Integer> arr = new ArrayList<Integer>();
int lenStr = str.length();
int lenCh = ch.length();
//主串开始的匹配位置
int pos = 0;
//模式串每次匹配位置
int k = 0;
//循环条件不是k<lenCh,这样的话可能死循环(没有匹配发生)
while(pos<lenStr) {
/*
* 首次进入没什么大作用,做要是为提高以后的匹配效率
* 写在最后一行也行
*/
k = next[k];
while(k<lenCh && str.charAt(pos)==ch.charAt(k)) {
pos++;
k++;
}
if(lenCh==k) {
arr.add(pos-k);
}else if(0==k) {
/*
* 不加这一句死循环
* 因为next[0] = 0
* 比如abcd和abce,到de不匹配,此时执行k = next[k](k=3),
* k变为0,发现d和a不匹配,此时k还是0,重复执行以上步骤,那么死循环了
*/
pos++;
}//实际上else就是k = next[k],所以才说k = next[k]写在最后一行也行
}
return arr;
}
}
分享到:
相关推荐
《字符串模式匹配KMP算法》教学课例设计 在这篇教学设计中,我们旨在帮助学生掌握KMP字符串模式匹配算法的基本概念和应用。通过本课例设计,学生将了解KMP算法的应用普遍性、实现机制和时间复杂度,并掌握计算next...
包含在字符串匹配,数据结构和有限的精密上的广泛的讨论。 提供彻底的B树的报告。 集中于实际的算法,即使他们不渐近最佳。 略述算法的技术具有关键的重要性的具体的申请 算法和计算理论手册是一次也包括很多理论...
<br>17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...
<br>17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...
<br>17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...
<br>17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...
<br>17.1 使用页面输出缓存 17.1.1 按参数改变缓存内容 17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用...
1. 串:串是字符的有限序列,空串是没有任何字符的串,而不是由空格构成的串。模式匹配是串的一种重要运算,串既可以采用顺序存储,也可以采用链式存储。 2. 图:设无向图的顶点个数为n,则该图最多有n(n-1)/2条边...
17.1.2 按头改变缓存内容 17.1.3 按自定义的字符串改变缓存内容 17.1.4 设置缓存位置 17.1.5 使用HttpCachePolicy类 17.2 使用页面分段缓存 17.2.1 按参数改变页面分段缓存 ...
18.3 字符串的使用 18.3.1 swap() 交換兩個字符串的內容 18.3.2 將string型字符串轉為char型字符串 18.3.3 char型字符串與函數 18.3.4 函數如何返回字符串 18.4 結構體 18.4.1 結構體的賦值 18.4.2 結構體與函數 ...
WinRAR 设置可以在注册表键 HKEY_CURRENT_USER\Software\WinRAR\Paths 中设置字符 串值 "AppData" 来覆盖默认的 %appdata%\WinRAR 路径。 <br> 例如,如果要保存主题文件到 WinRAR 文件夹中,设置 "c:\...
1.1.1 算法.................................................................................................................2 1.1.2 实体.................................................................