--------------------------------天道酬勤
KMP(字符串1,字符串2)
kmp算法實現字符串1不回溯,一趟找到字符串1中是否包含字符串2。關鍵在於如何確定失配時字符串2的偏移量。以下用一張圖來說明
代碼實現:
public class KmpDemo {
/*
* 字符串匹配算法演示
*/
public static void main(String[] args)
{
String t="abaabcac";
String s="acabaabaabcacaabc";
int[] arr=getNext(t);
System.out.println(kmp(s,t,arr));
}
//生成模式串匹配失敗後繼續匹配的位置
public static int[] getNext(String t)
{
int arr[]=new int[t.length()];
arr[0]=-1; //第一個字符不匹配
int i=0;
int j=-1;
while(i<t.length())
{
if(j==-1||t.charAt(i)==t.charAt(j))
{
i++;
if(i<t.length())
arr[i]=++j;
}
else
{
j=arr[j];
}
}
return arr;
}
public static boolean kmp(String s,String t,int[] arr)
{
int i=0;
int j=0;
while(i<s.length())
{
if(j==-1||s.charAt(i)==s.charAt(j))
{
i++;
j++;
if(j==t.length())
{
return true;
}
}
else
{
j=arr[j];
}
}
return false;
}
}