[Daily Practice] -最長迴文子串

問題描述

給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

示例 1:

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

示例 2:

輸入: "cbbd"
輸出: "bb"

該題目來源於leetcode,點擊進入

解題

	public static String longestPalindrome(String s) {
        int len = s.length();
        // 特判
        if (len < 2){
            return s;
        }

        int maxLen = 1;
        int begin  = 0;

        // 1. 狀態定義
        // dp[i][j] 表示s[i...j] 是否是迴文串


        // 2. 初始化
        boolean[][] dp = new boolean[len][len];
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }

        char[] chars = s.toCharArray();
        // 3. 狀態轉移
        // 注意:先填左下角
        // 填表規則:先一列一列的填寫,再一行一行的填,保證左下方的單元格先進行計算
        for (int j = 1;j < len;j++){
            for (int i = 0; i < j; i++) {
                // 頭尾字符不相等,不是迴文串
                if (chars[i] != chars[j]){
                    dp[i][j] = false;
                }else {
                    // 相等的情況下
                    // 考慮頭尾去掉以後沒有字符剩餘,或者剩下一個字符的時候,肯定是迴文串
                    if (j - i < 3){
                        dp[i][j] = true;
                    }else {
                        // 狀態轉移
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                }

                // 只要dp[i][j] == true 成立,表示s[i...j] 是否是迴文串
                // 此時更新記錄迴文長度和起始位置
                if (dp[i][j] && j - i + 1 > maxLen){
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }
        // 4. 返回值
        return s.substring(begin,begin + maxLen);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章