Shortest Palindrome

来源:互联网 发布:个人所得税申报的软件 编辑:程序博客网 时间:2024/05/01 22:58

暴力破解思路:补充完成之后的回文串中心必定在原字符串中----原字符串以第一个字符为起点必然存在至少一个回文串(长度可以为1)----找到原字符串中以第一个字符为起点最长的回文串----把剩余部分的翻转补充到原字符串头部。

优化方法:

1、求字符串s的翻转s_rev
2、将两个字符串进行拼接:{s}#{s_rev}
3、找出新字符串中最长公共前缀后缀长度comLen
4、s_rev.substring(0, s.length() - comLen)就是在原字符串头部插入的子串部分

求最长公共前缀后缀长度的时候用到了KMP算法

class Solution {public:string shortestPalindrome(string s) {string r = s;reverse(r.begin(), r.end());string t = s + "#" + r;vector<int> next(t.size(), 0);//next[i]表示从t[i]到开头的子串的相同前缀后缀的个数for (int i = 1; i < t.size(); ++i) {//求相同前缀后缀字母个数,采用了kmp算法优化?int j = next[i - 1];while (j > 0 && t[i] != t[j]) j = next[j - 1];next[i] = (j += t[i] == t[j]);}return r.substr(0, s.size() - next.back()) + s;}};


0 0