美文网首页
LeetCode5 最长回文子串

LeetCode5 最长回文子串

作者: 伍骁辛 | 来源:发表于2020-05-14 14:42 被阅读0次

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

示例 1:

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

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

/**
 * 解法 1: 暴力破解
 * 暴力求解,列举所有的子串,判断是否为回文串,保存最长的回文串。
 */
public boolean isPalindromic(String s) {
    int len = s.length();
    for (int i = 0; i < len / 2; i++) {
        if (s.charAt(i) != s.charAt(len - i - 1)) {
            return false;
        }
    }
    return true;
}

// 暴力解法
public String longestPalindrome1(String s) {
    if (s.isEmpty()) {
        return s;
    }
    String ans = "";
    int max = 0;
    int len = s.length();
    for (int i = 0; i < len; i++)
        for (int j = i + 1; j <= len; j++) {
            String test = s.substring(i, j);
            if (isPalindromic(test) && test.length() > max) {
                ans = s.substring(i, j);
                max = ans.length();
            }
        }
    return ans;
}

/**
 *   时间复杂度:两层for循环O(n²),for循环里边判断是否为回文 O(n),所以时间复杂度为 O(n³)。
 *   空间复杂度:O(1),常数个变量
 */


/**
 * 解法 2
 * 最简单直观的方法是遍历字符串,遍历的时候以每个字符为中心向左右两侧扩散
 * 对于奇数,我们以该字符为中心向两边扩散;对于偶数,我们以该字符和下一个字符作为中心字符,然后向两边扩散。
 */
private int start = 0, maxLen = 0;

public String longestPalindrome2(String s) {
    if(s.length() < 1)
        return s;

    for(int i=0; i<s.length(); i++){
        // 回文子串为奇数时,查找最长回文子串
        extendPalindrome(s, i, i);
        // 回文子串为偶数时,查找最长回文子串
        extendPalindrome(s, i, i+1);
    }

    return s.substring(start, start + maxLen);
}

private void extendPalindrome(String s, int left, int right){
    // 判断是否为回文子串,若是,则左指针向左移动,右指针向右移动
    while(left>=0 && right<s.length() && s.charAt(left) == s.charAt(right)){
        left--;
        right++;
    }

    // 回文子串查找完成后,判断刚刚查找的回文子串是否为最长回文子串,若是,则更新起始位置和最长长度
    if(maxLen < right-left-1){
        start = left + 1;
        maxLen = right -left - 1;
    }
}
/**
 * 整个算法流程的时间复杂度为O(n^2),空间复杂度为O(1)。
 */

更多LeetCode题目解法传送门

相关文章

  • leetcode动态规划问题汇总(陆续更新中。。。)

    题目 2019.12.26更新。。。 leetcode5 最长回文子串leetcode32 最长有效括号leetc...

  • leetcode5 最长回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 分析 ...

  • LeetCode5 最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "b...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • 打卡-最长回文子串

    最长回文子串(中等)

  • 最长回文子序列

    该问题区别于最长回文子串,子串必须是连续的,而子序列则可以跳跃,例如AABCAA的最长回文子串为AA,但是它的最长...

  • Manacher算法

    最长回文子串问题# 给定一个字符串,找出最长的回文子串,如"waabwswbfd",则最长子串为bwsb. 中心试...

  • 最长回文子串问题—Manacher算法

    最长回文串问题是一个经典的算法题。 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果...

  • LeetCode 第647题:回文子串

    1、前言 2、思路 此题与最长回文子串很像,只不过那个是求最长的回文子串,而这个是求回文子串的数目。但是他们的解法...

网友评论

      本文标题:LeetCode5 最长回文子串

      本文链接:https://www.haomeiwen.com/subject/igytohtx.html