214. Shortest Palindrome
Difficulty: Hard
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.
For example:
Given “aacecaaa”, return “aaacecaaa”.
Given “abcd”, return “dcbabcd”.
思路
在字符串前面添加字符是之成为回文,先找到以字符串的第一个字符开始的最长回文子串,再将剩余的子串反转后添加到字符串前,最终结果即为最短回文。
回文反转的结果是自身。字符串反转后,字符串中的回文子串不变。因此,可以先反转字符串,再找到两个字符串最长相同子串(子串为字符串前缀,反转字符串后缀),最长相同子串即为最长回文子串。
代码
[C++]
class Solution {
public:
string shortestPalindrome(string s) {
string rs = s;
reverse(rs.begin(), rs.end());
int len = s.size();
int i = len;
for(; i > 0; --i) {
string sub = s.substr(0, i);
string rsub = rs.substr(len - i);
if (sub == rsub)
break;
}
string res = rs.substr(0, len - i) + s;
return res;
}
};