kmp算法解决字符串问题
暴力匹配代码如下:
public static boolean violencematch(String[] arr1, String[] arr2) {
//思路:1.arr1从头遍历到尾,当遇到arr1[i] = arr2[0]时停下来
for (int i = 0; i < arr1.length; i++) {
int j = 0;
while (arr1[i] == arr2[j] && j < arr2.length) {
i++;
j++;
if (j == arr2.length) {
return true;
}
}
i = i - j;
}
return false;
}
kmp的实现方式:
public class KMP {
public static void main(String[] args)
{
String str="ababxbababcadfdsss";
String subStr="abcad";
int[] next=getNext(subStr.toCharArray());
int p=kmp(next,str.toCharArray(),subStr.toCharArray());
System.out.println(p);
}
public static int[] getNext(char[] c)
{
int[] next=new int[c.length];
next[0]=0;
for(int i=1,k=0;i<c.length;i++)
{
while(k>0&&c[k]!=c[i])
k=next[k-1];
if(c[k]==c[i])
k++;
next[i]=k;
}
return next;
}
public static int kmp(int[] next,char[] str,char[] c)
{
for(int i=0,p=0;i<str.length;i++)
{
while(p>0&&str[i]!=c[p])
p=next[p-1];
if(str[i]==c[p])
p++;
if(p==c.length)
return i-c.length+1;
}
return -1;
}
}