数据结构(字符串)—— 两字符串前后缀相等

这篇博客介绍了如何运用KMP算法解决寻找两个字符串A和B中最大相同前后缀长度的问题。通过合并A和B得到字符串P,然后构建next数组,找到P的最长回文子串对应的next值,即为最大L值。算法的时间复杂度和空间复杂度均为O(n)。文章提供了C++实现代码。

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

题目

对于两个串A和B ,给出一种算法使得能够保证正确地求出最大的L值,使得A串中长为L的前缀与B串中长为L的后缀相等,并分析该算法的复杂度。

思路和复杂度分析

  1. 对于本题,将串s1与串s2合并得到字符串P,通过求串P的前缀与后缀相同的最大长度,得到题解。

  2. 求串P的前缀与后缀相同的最大长度进一步转换为在KMP算法中所求的next数组的值

  3. 但是要注意调整的是:要求next数组长度是比字符串长度P多一位,next最后一位的值就是最大的L值

    在KMP算法中,求next数组是在一次循环中完成,对于每个位置的next值,都是根据前几个已知的值求得,因此其时间复杂度为O(n)O(n)O(n),空间复杂度也为O(n)O(n)O(n)

C++代码

#include<iostream>
#include <algorithm>
#include <string>
using namespace std;

int* findNext(string P) {
	int i, k;
	int m = P.length();					// m为模式P的长度
	int* next = new int[m];				// 动态存储区开辟整数数组
	next[0] = -1;
	i = 0; k = -1;
	while (i < m ) {					// 若写成 i < m 会越界
		while (k >= 0 && P[k] != P[i])	// 采用 KMP 找最大首尾子串
			k = next[k];				// k 递归地向前找
		i++;
		k++;
		next[i] = k;				
	}
	return next;
}

int main() {
	string s1, s2;
	cin >> s1 >> s2;
	string P = s1 + s2;
	int* next = new int[100];
	next = findNext(P);
	cout << next[P.length()];
}

image-20210328171359117

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值