LeetCode-字符串的最长回文子串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuzhixiong_521/article/details/87158837

题目链接

Problem.5:https://leetcode.com/problems/longest-palindromic-substring/

题目描述

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

示例

输入1:

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

输入2:

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

解析

首先将字符串转为char[]数组,并在数组的两端及元素中间插入“#”,形成一个新数组。例如字符串“babad”插入“#”之后,新数组为[‘#’,‘b’,‘#’,‘a’,‘#’,‘b’,‘#’,‘a’,‘#’,‘d’,‘#’]。然后遍历新数组,并以当前元素为中心向两边扩展(注意不能越界),直到不满足对称的条件为止,同时记录最大长度以及下标索引,最后根据下标索引以及最大长度获得最长回文子串,并将‘#’替换为空。

代码

public String longestPalindrome(String s) {
        char[] chars = new char[2 * s.length() + 1];
        for (int i = 0; i < s.length(); i++) {
            chars[2 * i] = '#';
            chars[2 * i + 1] = s.charAt(i);
        }
        chars[chars.length - 1] = '#';

        int max = 0;
        int idx = 0;

        for (int i = 0; i < chars.length; i++) {
            int k = 0;
            while (i - k >= 0 && i + k < chars.length && chars[i - k] == chars[i + k]) {
                k++;
            }
            if (k > max) {
                max = k;
                idx = i;
            }
        }

        String res = String.valueOf(chars).substring(idx - max + 1, idx + max);

        return res.replaceAll("#", "");
}

猜你喜欢

转载自blog.csdn.net/liuzhixiong_521/article/details/87158837