[LeetCode]Longest Palindromic Substring

解题思路:
遍历string,从每一个char往两边搜索(index:left,right),记录最大回文的 left 和 length

有一点优化的地方,就是如果连续几个字符相同,那么right直接指向最右边那个字符。
如果操作的优点是,不用区分 aba 和 abba 中的b带来的操作


// C++实现:
class Solution {
public:
    string longestPalindrome(string s) {
        if (s.length() < 2) return s;

        int maxLeft = -1;
        int maxLen = 0;
        for (int start = 0; start < s.length(); ){
            int left = start;
            int right = start;
            while(right < s.length()-1 && s[right+1] == s[right]){
                right ++;
            }

            start = right + 1;

            while(left > 0 && right < s.length()-1 && s[right + 1] == s[left - 1]){
                right ++;
                left --;
            }

            if (maxLen < right - left + 1){
                maxLeft = left;
                maxLen = right - left + 1;
            }
        }
        return s.substr(maxLeft, maxLen);
    }
};

// Java 实现:
public class Solution {
    public String longestPalindrome(String s) {
        if ( s.length() < 2) return s;
        char[] sc = s.toCharArray();

        int maxLeft = -1;
        int maxLen = 0;
        for (int start = 0; start < sc.length; ){
            int left = start;
            int right = start;
            while((right < sc.length-1) && (sc[right+1] == sc[right] )){
                right ++;
            }
            start = right + 1;

            while((right < sc.length-1 )&&( left > 0) && (sc[right+1] == sc[left-1])){
                right ++;
                left --;
            }

            if (maxLen < (right-left + 1)){
                maxLeft = left;
                maxLen = right-left + 1;
            }
        }
        return s.substring(maxLeft, maxLeft + maxLen);
    }
}

// Java 实现另一种办法
// 基于 回文的 中心可能是中间一个,也可能是中间一对
public class Solution {
    public String longestPalindrome(String s) {
        int start = 0;
        int end = 0;

        for (int i = 0; i < s.length(); ++i ){
            int len1 = palindromeLength(s, i, i);
            int len2 = palindromeLength(s, i, i+1);
            int len = Math.max(len1, len2);

            if ( len > end-start+1){
                start = i - len/2 + ((len%2 == 0)? 1 : 0);
                end = i + len/2;
            }
        }

        return s.substring(start, end+1);
    }

    private int palindromeLength(String s, int start, int end){
        int L = start;
        int R = end;
        while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)){
            L --;
            R ++;
        }
        return R - L -1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值