Leetcode #5 Longest Palindromic Substring 最长回文串 解题小节

1 题目理解

Longest Palindromic Substring
这道题是ACM一众的在线编程OJ系统里面的常客,最长回文串。很多题目都和这道题十分的类似,因此也具有很强的参考性和经典型。

什么事回文串呢?其实也就是一个字符串,正着反着看他的字符,都是一样的,比如aacc,abba之类的。

最长回文串的求解法很多,比如说最简单的就是直接开for循环在最外层,然后里面再嵌套一个顺序相反的for循环,如果两个字符相同,那么久继续比较他们中间的字符,检查是否构成回文串。

这种做法比较费时,因此我使用的则是另外一种判别方法,即从中心判别。

对于长度为奇数的回文串,我们从中间为标准(这里是一个字符),其两边距离相同位置的字符是一致的,而对于偶数的,那么也是以中间为标准(这里的中间并不是一个字符了,只是一个概念了,主义了)。那么我们最外层依然一个for循环,在每个位置,就认为他是一个中心,然后以偶数和奇数的长度两种情况去检查是否构成回文串就可以了

2 原题

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

Subscribe to see which companies asked this question

3 AC解

/** * 这题有很多方法,这里采用中心法,分为奇数和偶数 * 奇数:从当前位置向两边检查,是否是回文串 * 偶数:选择两个位置进行检查,是否是回文串 * */
public class Solution {
    char chars[];
    String S;
    int max=0;
    int length;
    int maxStart=0,maxEnd=0;
    //检查奇数的
    public void checkOdd(int mid){
        int start=mid-1;
        int end=mid+1;
        while(start>=0 && end<length && chars[start]==chars[end]){
            //构成回文串
            start--;
            end++;
        }
        //恢复
        start++;
        end--;
        if(end-start+1 > max){
            max=end-start+1;
            this.maxStart=start;
            this.maxEnd=end;
        }
    }

    //检查奇数的
    public void checkEven(int mid1,int mid2){
        int count = 0;
        int start=mid1;
        int end=mid2;
        while(start>=0 && end<length && chars[start]==chars[end]){
            //构成回文串
            start--;
            end++;
            count+=2;
        }
        start++;
        end--;
        if(count > max){
            max=count;
            this.maxStart=start;
            this.maxEnd=end;
        }
    }

    public String longestPalindrome(String s) {
        this.S=s;
        this.chars=s.toCharArray();
        this.length=s.length();
        for(int i=0;i<s.length();i++){
            checkOdd(i);
        }
        for(int i=1;i<s.length();i++){
            checkEven(i-1,i);
        }
        return s.substring(maxStart,maxEnd+1);

    }
}

最后:PS 我也并不是严格的按照顺序来的。。。第六题我还没做。。但是后面却已经做了好多了。。只是有点强迫症,想顺着更新。。这就去做

你可能感兴趣的:(LeetCode,substring,最长,回文串)