-
题目
题目描述:给定字符串s,求解含有两个s的最短字符串。例如"ababa"含有两个"aba" -
解题思路:
利用kmp求解字符串的最后一个字符的下一个字符的next[]
处理成最大前缀和最大后缀能重复多少,向尾部添加从最大相同前缀后开始到结尾的子串 -
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;
int Get_EndNext_Length(string str2)
{
int len = str2.length();
vector<int> next(len+1);
next[0] = -1;
next[1] = 0;
int pos = 2;
int cn = 0;
while(pos < next.size())
{
if(str2[pos-1] == str2[cn]){
next[pos++] = ++cn;
}else if(cn > 0){
cn = next[cn];
}else{
next[pos++] = 0;
}
}
return next[next.size()-1]; //next数组的最后一个值
}
string Answer_Of_Shortest_Twice(string str1)
{
int len = str1.length();
if(len == 0 || str1.empty()) return "";
else if(len == 1){
return str1+str1;
}else if(str1.length() == 2){
return str1[0] == str1[1] ? str1 + str1.substr(1) : str1+str1;
}else{
return str1 + str1.substr(Get_EndNext_Length(str1));
}
}
int main(int argc, char const *argv[])
{
string s1 = "a";
cout<<Answer_Of_Shortest_Twice(s1)<<endl;
string s2 = "ababa";
cout<<Answer_Of_Shortest_Twice(s2)<<endl;
string s3 = "12312";
cout<<Answer_Of_Shortest_Twice(s3)<<endl;
string s4 = "abcabc";
cout<<Answer_Of_Shortest_Twice(s4)<<endl;
return 0;
}