最长回文子串 中等🌟🌟🌟🌟🌟

问题描述

原文链接:5. 最长回文子串

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

代码实现

Java

class Solution {
    /* 动态规划三部曲
        s = "cba"

        1、
        dp[i][j]:字符串[i...j]是否为回文串=》长度:j - i + 1
        2、关系式
        s[i] == s[j]=>dp[i][j] = dp[i+1][j-1]=>
        s[i] != s[j] =>dp[i][j] false。

        3、初始值
        dp[0..i][0] = true.




    */
    public String longestPalindrome(String s) {
        char[] c = s.toCharArray();
        int n = s.length();

        boolean[][] dp = new boolean[n][n];
        int start = 0;
        int end = 0;
        int max = 0;

        for(int i = 0; i < n; i++){
            dp[i][0] = true;
        }

        for(int j = 1; j < n; j++){
            for(int i = 0; i < j; i++){
                if(c[i] != c[j]){
                    dp[i][j] = false;
                }else{
                    if(j - i + 1 > 3){
                        dp[i][j] = dp[i+1][j-1];
                    }else{
                        dp[i][j] = true;
                    }
                }

                if(dp[i][j] && j - i + 1 > max){
                    max = j - i + 1;
                    start = i;
                    end = j;
                }
            }
        }

        return s.substring(start, end + 1);
    }
}

Python

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 动态规划三部曲
        # s = "cba"

        # 1、
        # dp[i][j]:字符串[i...j]是否为回文串=》长度:j - i + 1
        # 2、关系式
        # s[i] == s[j]=>dp[i][j] = dp[i+1][j-1]=>
        # s[i] != s[j] =>dp[i][j] false。

        # 3、初始值
        # dp[0..i][0] = true.

        c = list(s)
        n = len(s)

        dp = [[False] * n for _ in range(n)]
        start = 0
        end = 0
        max_len = 0

        for i in range(n):
            dp[i][0] = True

        for j in range(1, n):
            for i in range(j):
                if c[i] != c[j]:
                    dp[i][j] = False
                else:
                    if j - i + 1 > 3:
                        dp[i][j] = dp[i+1][j-1]
                    else:
                        dp[i][j] = True

                if dp[i][j] and j - i + 1 > max_len:
                    max_len = j - i + 1
                    start = i
                    end = j

        return s[start:end+1]

C++

class Solution {
public:
    string longestPalindrome(string s) {
        /*
        动态规划三部曲
        s = "cba"

        1、
        dp[i][j]:字符串[i...j]是否为回文串=》长度:j - i + 1
        2、关系式
        s[i] == s[j]=>dp[i][j] = dp[i+1][j-1]=>
        s[i] != s[j] =>dp[i][j] false。

        3、初始值
        dp[0..i][0] = true.
        */

        int n = s.length();

        vector<vector<bool>> dp(n, vector<bool>(n, false));
        int start = 0;
        int end = 0;
        int max_len = 0;

        for(int i = 0; i < n; i++) {
            dp[i][0] = true;
        }

        for(int j = 1; j < n; j++) {
            for(int i = 0; i < j; i++) {
                if(s[i] != s[j]) {
                    dp[i][j] = false;
                } else {
                    if(j - i + 1 > 3) {
                        dp[i][j] = dp[i+1][j-1];
                    } else {
                        dp[i][j] = true;
                    }
                }

                if(dp[i][j] && j - i + 1 > max_len) {
                    max_len = j - i + 1;
                    start = i;
                    end = j;
                }
            }
        }

        return s.substr(start, end - start + 1);
    }
};

Go

func longestPalindrome(s string) string {
    /*
    动态规划三部曲
    s = "cba"

    1、
    dp[i][j]:字符串[i...j]是否为回文串=》长度:j - i + 1
    2、关系式
    s[i] == s[j]=>dp[i][j] = dp[i+1][j-1]=>
    s[i] != s[j] =>dp[i][j] false。

    3、初始值
    dp[0..i][0] = true.
    */
    n := len(s)

    dp := make([][]bool, n)
    for i := 0; i < n; i++ {
        dp[i] = make([]bool, n)
        dp[i][0] = true
    }

    start := 0
    end := 0
    maxLen := 0

    for j := 1; j < n; j++ {
        for i := 0; i < j; i++ {
            if s[i] != s[j] {
                dp[i][j] = false
            } else {
                if j - i + 1 > 3 {
                    dp[i][j] = dp[i+1][j-1]
                } else {
                    dp[i][j] = true
                }
            }

            if dp[i][j] && j - i + 1 > maxLen {
                maxLen = j - i + 1
                start = i
                end = j
            }
        }
    }

    return s[start:end+1]
}

发表评论

后才能评论