其他分享
首页 > 其他分享> > LeetCode5.最长回文子串

LeetCode5.最长回文子串

作者:互联网

LeetCode5.最长回文子串

题目描述

/**
     * 给你一个字符串 s,找到 s 中最长的回文子串。
     */

思路分析

思路1.暴力遍历思路
  1. 第一次遍历字符串中所有字符
  2. 第二次遍历找到该字符对应所有子串
  3. 判断这些子串是否为回文数
  4. 如果是,记录最长子串并返回
  5. 暴力遍历时间复杂度太高,一般不采用
思路2 .中心扩展思路
  1. 因为回文串的每个字符是关于中心完全对称的
  2. 因此可以使用从中心字符向两边扩展的思路
  3. 如果每扩展一步左右两边的字符还相等,则继续扩展,否则结束扩展
  4. 中心对称也有两种,要不类似aba这种,关于一个字符对称,要么类似abba这种
  5. 依次遍历字符串的每个字符,使用中心扩展,拿到中心扩展后的回文子串
  6. 判断是否中心对称,如果中心对称,记录回文子串及其大小
  7. 比较最长回文子串的成绩,记录左右索引

源码及分析

public String longestPalindrome(String s) {
        //暴力遍历思路
        //1.第一次遍历字符串中所有字符
        //2.第二次遍历找到该字符对应所有子串
        //3.判断这些子串是否为回文数
        //4.如果是,记录最长子串并返回
        //5.暴力遍历时间复杂度太高,一般不采用

        //中心扩展思路
        //1. 因为回文串的每个字符是关于中心完全对称的
        //2. 因此可以使用从中心字符向两边扩展的思路
        //3. 如果每扩展一步左右两边的字符还相等,则继续扩展,否则结束扩展
        //4. 中心对称也有两种,要不类似aba这种,关于一个字符对称,要么类似abba这种
        //5. 依次遍历字符串的每个字符,使用中心扩展,
        //   判断是否中心对称,如果中心对称,记录回文子串及其大小

        //字符串校验,如果是空串,直接返回空
        if (s == null || s.length() < 1) {
            return "";
        }
        //定义两个变量保存要返回的最长回文子串的左右索引
        int left = 0;
        int right = 0;
        //遍历这个字符串,判断每一个字符所中心扩展的回文子串长度
        for (int i = 0; i < s.length(); i++) {
            //第一种中心对称的情况
            int len1 = centerExpanding(s, i, i);
            //第二种中心对称的情况
            int len2 = centerExpanding(s, i, i + 1);

            //记录这两种中心扩展的最长回文子串的长度
            int len = Math.max(len1, len2);

            //如果新的回文子串的长度大于旧的回文子串的长度
            //则重置要返回在最长回文子串的索引
            if (len > (right - left)) {
                //重置左侧索引
                left = i - (len - 1) / 2;
                //重置右侧索引
                right = i + len / 2;
            }
        }
        //返回最长回文子串
        return s.substring(left, right + 1);
    }

    //编写中心扩展的方法

    /**
     * @param s     要判断的字符串
     * @param left  回文子串左边的索引
     * @param right 回文子串右边的索引
     * @return      回文子串的长度
     */
    public int centerExpanding(String s, int left, int right) {
        //循环判断满足条件的最长回文子串的长度
        while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
            left--;
            right++;
        }
        return right - left - 1;
    }

标签:子串,字符,LeetCode5,遍历,right,left,回文
来源: https://www.cnblogs.com/mx-info/p/14733881.html