对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。
给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。
测试样例:
“ab”,2
返回:“a”
解题思路
还是使用manacher算法
找到第一个扩到边界的字符,填上前面不对称的数据即最短回文串
class Palindrome {
public:
string addToPalindrome(string A, int n) {
string ans, res ="$#";
for(int i=0;i<n;i++){
res += A[i];
res += "#";
}
int m = res.size();
vector<int> p(m,0);
int r = 0, c = 0;
for(int i = 0; i < m; i++){
p[i]= r > i ? min(p[2*c-i], r-i) : 1;
while(res[i + p[i]] == res[i-p[i]]) p[i]++; //暴力扩
if(r < i + p[i]){ //更新右边界
r = i + p[i];
c = i;
}
if(r == m) {
for(int j = 2*c - r;j >= 1; j--){
if(res[j] != '#') ans += res[j];
}
return ans;
}
}
}
};