直观的想法,先找到s从0开始的最长回文子串,然后答案就是右边的反转+s
问题变为求从0开始的最长回文子串,如果直接用从右贪心枚举的方法,时间复杂度是O(N^2), 超时。
class Solution {
public String shortestPalindrome(String s) {
StringBuilder sb = new StringBuilder();
int i;
for(i=s.length()-1;i>=0;i--){
if(isPalindrome(s, 0, i)) break;
}
if(i==s.length()-1) return s;
for(int j=s.length()-1;j>i;j--){
sb.append(s.charAt(j));
}
sb.append(s);
return sb.toString();
}
private boolean isPalindrome(String s, int left, int right){
int i = left, j = right;
while(i<j){
if(s.charAt(i)!=s.charAt(j)) return false;
i++;
j--;
}
return true;
}
}
一种优化方法是事先将字符串反转,用字符串比较代替判断回文,严格来说,字符串比较也是O(n), 所以总的时间复杂度还是O(N^2),
class Solution {
public:
string shortestPalindrome(string s) {
int n = s.size();
string revs = s;
reverse(revs.begin(),revs.end());
for(int i=n;i>=0;i--){
if(s.substr(0,i)==revs.substr(n-i,n)){
return revs.substr(0,n-i)+s;
}
}
return "";
}
};
Python能过
class Solution:
def shortestPalindrome(self, s: str) -> str:
ss = s[::-1]
n = len(s)
for i in range(n,0,-1):
if s[0:i]==ss[n-i:n]:
return ss[0:n-i]+s
return ""