题目:
给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和“cdefg”是"cde",长度为3。
解析:
假设两个字符串分别为P[0..n]和S[0..m],那么这个问题实际上是要求解的l1 = max{n-i+1 | P[i..n] = S[0..m-i]}以及l2 = max{m-i+1 | P[0..m-i] = S[i..m]}中更大的一个,即求解L=max{l1,l2}。这实际上是一个字符串匹配问题,这个时候自然而然的会想到最高效的KMP算法。以求l1为例,我们首先求出字符串S[0..m]的前缀信息,然后将S在P上进行匹配,当匹配到S[k] = P[n]时,k即为P的后缀与S前缀的最长重叠子串的长度。求l2也类似。
根据以上的分析,则不难给出代码:
#include <iostream>
#include <string>
using namespace std;
//计算字符串的前缀函数
int* computePrefix(const char *p, int n)
{
if(p == NULL || n <= 0) return NULL;
int *pr = new int[n];
memset(pr, -1, sizeof(int)*n);
int k = -1;
for(int i = 1; i < n; i++)
{
while(k > -1 && p[k+1] != p[i]) k = pr[k];
if(p[k+1] =