- 题目描述
如何在一个给定字符串str1,要求在末尾添加使字符str1成为最短的回文串str2
如 str1 = "abc12321"
则 str2 = "abc12321cba"
- 解题思路:
必须包含最后一个字符的回文串,之后将回文串前面的逆序添加到末尾即可
将manacher算法的改写
当manacher算法第一次到达最后一个字符时,停止,L,R,C都确定,将L之前的逆序添加到末尾ok
3.代码
#include<bits/stdc++.h>
using namespace std;
std::vector<char> GetManacherString(char str[])
{
int len = strlen(str);
std::vector<char> res(len*2+1);
int index = 0;
for (int i = 0; i < res.size(); ++i)
{
res[i] = (i&1) == 0 ? '#' : str[index++];
}
return res;
}
std::vector<char> Manacher_Change_GetShortestEnd(char str[]){
int len = strlen(str);
std::vector<char> new_string = GetManacherString(str);
int pR = -1;
int C = -1;
int maxContainsEnd = -1;
std::vector<int> pArr(new_string.size(),0);
for (int i = 0; i < new_string.size(); ++i)
{
pArr[i] = pR > i ? min(pArr[2*C-i],pR-i) : 1;
while(i+pArr[i] < new_string.size() && i - pArr[i] > -1){
if (new_string[i+pArr[i]] == new_string[i-pArr[i]]){
pArr[i]++;
}else{
break;
}
}
if(i+pArr[i] > pR){
pR = i + pArr[i];
C = i;
}
if(pR == new_string.size()){
maxContainsEnd = pArr[i];
break;
}
}
//cout<<"maxContainsEnd == "<< maxContainsEnd <<endl;
std::vector<char> res(len-maxContainsEnd+1);
for (int i = 0; i < res.size(); ++i)
{
res[res.size()-i-1] = new_string[i*2+1];
}
return res;
}
int main()
{
char str[] = "123aba";
cout<<"string is: "<<str<<endl;
cout<<"Manacher string is: ";
std::vector<char> ans = GetManacherString(str);
for (int i = 0; i < ans.size(); ++i)
{
cout<<ans[i];
}
puts(" ");
cout<<"Manacher_Change_GetShortestEnd is: ";
ans = Manacher_Change_GetShortestEnd(str);
for (int i = 0; i < ans.size(); ++i)
{
cout<<ans[i];
}
puts(" ");
return 0;
}