最长回文子串(Longest Palindromic Substring)java

最长回文子串(Longest Palindromic Substring)

题干

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

分析

这个题就是得到最大的回文子串,那么,大致分为两步

  • 得到所有字串
  • 判断回文

所谓的优化也是对这两步进行优化而已
对于这个题呢,我首先想到的就是暴破,也这么做了,结果提交的时候在leetcode上超时,好嘛,那就优化下,然后就有了另一种方式。

  • 暴破(不完全暴破,有一点优化)
    这种方式就是获得所有的字串,两个循环,字串起点:i->0~s.length-1,字串终点:j->s.length-1~i。把所有字符都做一次字串起点,而字串终点是从s的最远处开始减短,如果发现回文,就break,那么这一次的以这个字符做起点的字串回文遍历就结束了,接着以下一个字符作为起点。
public String longestPalindrome(String s) {
        //如果s为"",默认为0,匹配到的为"",如果s长度大于0,就默认长度为1,匹配到的为第一个字符
        int maxLen = 0;
        String maxValue = "";
        if (s.length() > 0) {
            maxLen = 1;
            maxValue = s.charAt(0)+"";
        }

        for (int i = 0; i < s.length(); i++) {
            for (int j = s.length()-1; j > i; j--) {
                if (judge(s,i,j)) {
                    if (j-i+1 > maxLen) {
                        maxLen = j-i+1;
                        maxValue = s.substring(i, j + 1);
                    }
                    break;
                }
            }
        }
        return maxValue;
    }

    private boolean judge (String s, int startIndex, int endIndex) {
        char[] chars = s.toCharArray();
        for (int i = startIndex; i <= (endIndex+startIndex)/2; i++) {
            if (chars[i] != chars[endIndex-i+startIndex]) {
                return false;
            }
        }
        return true;
    }

  • 降序长度字串法
    对于字串的遍历,我们没必要得到全部字串,我们只要从最长的字串开始回文判断,每次字串的长度减1,将该长度所有字串判断完长度再减1,这样一来,一旦发现回文直接return,因为第一个发现的回文一定是最长的。
    那么问题就是怎么依次获得等长的字串了,看代码
public String longestPalindrome(String s) {
        //如果s为"",默认为0,匹配到的为"",如果s长度大于0,就默认长度为1,匹配到的为第一个字符
        int maxLen = 0;
        String maxValue = "";
        if (s.length() > 0) {
            maxLen = 1;
            maxValue = s.charAt(0)+"";
        }

        for (int i = s.length(); i > 0; i--) {
            for (int j = 0; j < s.length()-i; j++) {
                if (judge(s,j,j+i)) {
                    return maxValue = s.substring(j, j+i+1);
                }
            }
        }
        return maxValue;
    }

    private boolean judge (String s, int startIndex, int endIndex) {
        char[] chars = s.toCharArray();
        for (int i = startIndex; i <= (endIndex+startIndex)/2; i++) {
            if (chars[i] != chars[endIndex-i+startIndex]) {
                return false;
            }
        }
        return true;
    }

猜你喜欢

转载自blog.csdn.net/zhangjingao/article/details/81233310