串的模式匹配:KMP算法

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,后面的值为模式串中对应的字符第一次出现的位置

你可能感兴趣的:(数据结构与算法)