串的模式匹配:KMP算法

原创 2015年11月17日 16:54:08
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,后面的值为模式串中对应的字符第一次出现的位置

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

模式匹配kmp算法的ppt

  • 2011-07-27 10:41
  • 223KB
  • 下载

数据结构例程——串的模式匹配(KMP算法)

问题:串的模式匹配 KMP算法:#include #include "sqString.h" void GetNext(SqString t,int next[]) /*由模式串t求出next值...

模式匹配KMP算法

  • 2014-04-13 22:11
  • 28KB
  • 下载

数据结构_串_串的模式匹配_KMP算法_C++实现

"head.h" #include #include using namespace std; class STRING { public: void GetString(); v...

模式匹配:KMP算法

《数据结构》严蔚敏版(java解)——第四章 串01 串的模式匹配KMP算法

概念:KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n)。 特点:相比一般简单的字...

模式匹配的KMP算法详解.

  • 2011-07-08 08:28
  • 34KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)