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 我也并不是严格的按照顺序来的。。。第六题我还没做。。但是后面却已经做了好多了。。只是有点强迫症,想顺着更新。。这就去做

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值