一字符串前缀与另一字符串后缀的最大相同子串

·思想来源于KMP,非常巧妙:KMP匹配失败后,模式串指针j正好就是模式串的前缀与字符串的后缀的最大重叠长度。


#include
#include
using namespace std;
const int maxn = 1e5 + 10;
void cal_next(string str, int* next, int len)
{
	next[0] = next[1] = 0;
	for (int i = 1; i<len; ++i)
	{
		int j = next[i];
		while (j&&str[i] != str[j])
			j = next[j];
		next[i + 1] = (str[j] == str[i]) ? j + 1 : 0;
	}
}
int kmp(string str, int slen, string ptr, int plen)
{
	//int *next=new int[plen];
	int next[maxn];
	cal_next(ptr, next, plen);
	/*
	for(int i=0;i
	int j = 0;
	for (int i = 0; i<slen; i++)
	{
		while (j&&ptr[j] != str[i])
			j = next[j];
		if (ptr[j] == str[i])
			++j;
	}
	//printf("j:%d\n",j);
	return j;
}



int main()
{
	string ptr("45678");
	string str("1234567");

	int plen = ptr.length(), slen = str.length();
	int len = kmp(str, slen, ptr, plen);
	//printf("len:%d\n",len);
	if (len == 0)  printf("0\n");
	else {
		string ans(ptr.substr(0, len));
		cout << ans;
		printf(" %d\n", len);
	}
	
	system("pause");
	return 0;
}
/*
-------------------- -
作者:紫芝
来源:CSDN
原文:https ://blog.csdn.net/qq_40507857/article/details/82259187 
版权声明:本文为博主原创文章,转载请附上博文链接!
*/

你可能感兴趣的:(笔记杂烩,KMP,前缀,后缀,子串)