发现字符串的匹配完全要考虑全面,如果考虑的情况不足够全面,就很可能出现这个例子可以运行,下一个例子的就行不通,毕竟匹配可能遇到各种各样的情况。本着可以实现效果就可以的原则,编的代码也实在是不优美,BM参考了别人的代码,因为写的精炼,按照自己的思路来写,然后发现有的可以运行,有的就达不到相应的效果。主要实现了暴力字符串匹配、KMP、BM、Sunday四种,几天的时间学习完的,回头再看的时候发现自己都有点忘记了,赶紧记下来~
暴力字符串匹配,效率比较低,因为对主串来说,模式串每次移动的位置都为一个单位。而其它的,KMP、BM、Sunday则是按照自己的原则尽可能的增大移动的位数。下面针对KMP、BM、Sunday简单的介绍
KMP
KMP主要是利用模式串本身的特点来计算出NEXT值,模式串中的每一个字符都有一个NEXT值,NEXT为整型数组,比如NEXT[i]就代表在模式串的第i个位置的部分匹配值,其实就是模式串和主串最后一个匹配位置的部分匹配值,i+1个位置两个串就不匹配了。利用已经匹配的长度减去部分匹配值就可以得到模式串的移动位数。其实大白话就是现在主串匹配的子串在模式串中是否还存在,在计算NEXT值时则是利用已经匹配模式串的前缀和后缀,求前缀和后缀的最大长度。NEXT值下标是从1开始的
文章http://blog.csdn.net/buaa_shang/article/details/9907183
public class KMP {
public static void main(String[] args) {
/*String str = "ababc";
String orig ="abababc";*/
String str = "abaabcac";
String orig ="abcabaaabaabcac";
/*String str = "aba";
String orig ="aba";*/
int[] next = get_Next(str);
for(int i=0;i<str.length()+1;i++){
System.out.print(next[i]);
}
System.out.println();
KMP.search(orig, str, next);
}
//next[j]表示在当前模式串到T[j]遇到失配的情况,在模式串中重新和主串匹配的位置
public static int[] get_Next(String str){
//对str求出各个字符位置的部分匹配值
int[] next = new int[str.length()+1];
int j=0;
next[0]=next[1]=0;
for(int i=1;i<str.length();i++){
while(j>0&&str.charAt(j)!=str.charAt(i))
j=next[j];
if(str.charAt(i)==str.charAt(j))j++;
next[i+1]=j;
}
return n