关闭

串的模式匹配:KMP算法

标签: kmp算法java
142人阅读 评论(0) 收藏 举报
分类:
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,后面的值为模式串中对应的字符第一次出现的位置

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16146次
    • 积分:458
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:4篇
    • 译文:0篇
    • 评论:1条
    最新评论