kmp算法以及暴力匹配算法的实现

KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。

接下来大家请看代码

public class kmp算法 {

public static void main(String[] args) {

int[] next = GetKmpNext(“657”);

int kmp = kmp(“123465789”, “657”, next);

System.out.println(kmp);

int bl = BL(“123456”, “345”);

System.out.println(bl);

}

public static int BL(String a,String b){

int i=0,j=0;

while (i

if (a.charAt(i) == b.charAt(j)) {

i++;

j++;

} else {

i = i - (j - 1);//从原字符串的下一位重新进行查找

j=0;//重新匹配字符串

}

}

if (j==b.length()){

return i-j;//返回字符串中存在子字符串的初始位置

}else {

//没有找到

return -1;

}

}

//利用部分匹配值表进行寻找 返回找到子字符串头的位置

public static int kmp(String a,String b,int []next){

for (int i=0,j=0;i

//需要考虑当两个值不相等时 调整j的大小

while
(j>0&&a.charAt(i)!=b.charAt(j)){

j=next[j-1];//j为部分匹配表中前一个字符串的部分匹配值

}

if (a.charAt(i)==b.charAt(j)){

j++;

}

if (j==b.length()){//找到了

return i-j+1;//因为j++后 i没有++就return了

}

}

//如果没有找到

return -1;

}

//获得字符串的部分匹配表

/部分匹配值为数前序数组和后续数组交集的中最长字符串的长度/

public static int [] GetKmpNext(String str){

int []Next=new int[str.length()];

Next[0]=0;//当只有一个数组中字符串只有一位时
匹配结果集为0

for (int i=1,j=0;i

while
(j>0&&str.charAt(i)!=str.charAt(j)){

j=Next[j-1];//j为部分匹配表中前一个匹配值

}

if (str.charAt(i)==str.charAt(j)){

j++;

}

Next[i]=j;//将数据存入部分匹配表

}

return Next;

}

}

你可能感兴趣的:(面试,kmp,暴力字符串匹配,算法,java,数据结构)