Leetcode 214 最短回文串 贪心思想

直观的想法,先找到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 ""

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值