LeetCode-#5-最长回文子串(Longest Palindromic Substring)

版权声明:一篇成长日记文章,没什么转载价值。 https://blog.csdn.net/zhaoyanga14/article/details/83049881

题目:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 的最大长度为1000。

示例 1:

输入: "babad"输出: "bab"注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"输出: "bb"


这道题我的想法是遍历字符串中所有的字符,对每个字符(假设它在字符串中下标是i)判断它左边i和右边i+1是否相同,相同的话再判断i-1和i+2是否相同,以此类推。每次循环都记录回文子串的长度,将最长的回文子串长度len以及中间位置字符的下标index记录下来,最终截取字符串s,求得结果。

class Solution {
public String longestPalindrome(String s) {
//字符串为空就没必要算了。
        if(s == null || "".equals(s)){
            return "";
        }
//声明两个变量,len用来记录最长回文子串的长度,index记录该子串中间字符在字符串s中的下标。
//这里不要问我为啥n=s.length(),看似多此一举,但是这样确实快。。。因为不用多此调用length()方法。
        int len = 0,index = 0,n=s.length();
//开始循环遍历字符串s中的每个字符
        for(int i=0;i<n;i++){
//这里分两种情况,一种是奇数情况,一种是偶数情况
//奇数
            if(getLength(s,n,i,i)>len){
                len = getLength(s,n,i,i);
                index = i;
            }
//偶数
            if(getLength(s,n,i,i+1)>len){
                len = getLength(s,n,i,i+1);
                index = i;
            }
        }
//  求得结果,这里第一个参数中(len-1)的目的是为了让偶数情况下少取左边一个多余的,因为len/2是向左取
//值。不理解的话,举个例子,加入字符串s是”addc”,求得最长回文子串长度len是2,index是1。那如果截
//取,1-len/2=0,这就是从0取了,而我们取substring(1,3);所以要1-(len-1)/2=1。
        return s.substring(index-(len-1)/2,index+len/2+1);
    }
    public int getLength(String s,int n,int left,int right){
        while(left >= 0 && right < n && s.charAt(left)==s.charAt(right)){
            left--;
            right++;
        }
        return right-left-1;
    }
}

效率还可以,复杂度应该是O(n^2)吧,时间紧迫还要刷别的题,这里就不探讨大佬的解法了。

猜你喜欢

转载自blog.csdn.net/zhaoyanga14/article/details/83049881