给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
###题解
有马拉车和kmp的解法 博主因为太久没写马拉车算法忘记了马拉车算法 所以直接使用kmp算法来解决
本质就是求文本串正序和逆序的最长公共子串长度,其实就是kmp的next数组的求法 所以我们先将串逆置然后添入当前串之后就是寻求新的文本串的循环节长度了。具体实习代码如下
class Solution {
public:
string shortestPalindrome(string s) {
int n=s.size();
string ss=s;
reverse(ss.begin(),ss.end());
string str =s+"#"+ss;
vector<int>next(2*n+10);
get_next(str,next);
return ss.substr(0,n-next[2*n+1])+s;
}
void get_next(string &str,vector<int>&next)
{
next[0]=-1;
int i=0,k=-1;
while(i<str.size())
{
if(k==-1||str[i]==str[k])
{
next[++i]=++k;
}else k=next[k];
}
}
};