7-3 最长公共前后缀

本文深入解析KMP算法在字符串匹配中的应用,通过求解最长公共前后缀问题,介绍了KMP算法的核心思想及其实现步骤。以一个具体的字符串为例,详细展示了如何构造next数组,从而高效地解决字符串匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。例如对于字符串 abacaba,其前缀有 aababaabacabacab,后缀有bacabaacabacabaababaa。最长公共前后缀就是 aba。现给出一个长度为 N 的字符串 S,对于每个 M (0<=M<N),求出连续子串 S[0..M] 的最长公共前后缀。

输入格式:

输入数据仅有一行,包含一个长度不超过 100,000 的仅由字母 a-z 构成的字符串。

输出格式:

对于每个 M (0,1,2,...,N−1),输出对应的最长公共前后缀长度,以空格分隔,且行尾不得有多余空格。

输入样例:

abcdabcdabce

输出样例:

0 0 0 0 1 2 3 4 5 6 7 0

题意:给定一行字符串,然后对其所有的连续子串,从0下标开始到len-1下标 ,求其最长相等的前后缀的长度。

思路:刚好符合kmp算法中next【】的定义,即next【i】即表示子串长度为i+1,s【0.....i】这个子串的最长相等前后缀所对应的最大的k,而k+1正好是最长相等前后缀的长度。

#include<cstdio>
#include<cstring>
const int maxn=100010;

int next[maxn]={0};

void getNext(char s[],int len){
	
	int j=-1;
	next[0]=-1;
	
	for(int i=1;i<len;i++){
		
		while(j!=-1&&s[i]!=s[j+1]){
			
			j=next[j];
		}//当往前找的时候,采用每次让j等于next【j】的方法要方便的多 
		
		if(s[i]==s[j+1]){
			
			j++;
		}//当新增加的一项 可以满足 相等,则可在上次求得的j的基础上+1就行 
		
		next[i]=j;
	}
	
	
}

int main(){
	
     char s[maxn];
     
	 gets(s);
	 
	 int len=strlen(s);
	 getNext(s,len);
	 
	 for(int i=0;i<len;i++){
	 	
	 	if(i) putchar(' ');
	 	
	 	printf("%d",next[i]+1);
	 }
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值