package KMP;
public class Main
{
public static void main(String args[])
{
String s = "BBC ABCDAB ABCDABCDABDEABCDABDABD";
String t = "ABCDABDABD";
int i = KMPIndex(s, t);
if (i == -1)
System.out.println("flase");
else
System.out.println("true,index:" + i);
}
public static void GetNext(String t, int next[])
{
int j, k;
j = 0;
k = -1;
next[0] = -1; // 模式串next数组第一位为-1
while (j < t.length() - 1)
{
if (k == -1 || t.charAt(j) == t.charAt(k))
{
j++;
k++;
next[j] = k;// 模式串next数组后面的值为模式串中对应的字符第一次出现的位置
} else
k = next[k];
}
System.out.print(" ");
for (int i = 0; i < t.length(); i++)
{
System.out.print(t.charAt(i) + " ");
}
System.out.println();
for (int i = 0; i < t.length(); i++)
{
System.out.print(next[i] + " ");
}
System.out.println();
}
public static int KMPIndex(String s, String t)
{
int[] next = new int[100];
int i = 0, j = 0;
GetNext(t, next);
while (i < s.length() && j < t.length())
{
if (j == -1 || s.charAt(i) == t.charAt(j))
{
i++; //i加,j加
j++;
} else
j = next[j]; //i不变,j后退---->模式串右滑,匹配串还是取s[i]
}
if (j >= t.length())
return (i - t.length());
else
return (-1);
}
}
输出:
A B C D A B D A B D
-1 0 0 0 0 1 2 0 1 2
true,index:23
由此可见,模式串的next数组第一位为-1,后面的值为模式串中对应的字符第一次出现的位置