最長迴文子串java動態規劃

在Java中,你可以使用動態規劃來解決最長回文子串問題。動態規劃是一種解決這類問題的常見策略,它通過將問題分解為更小的子問題,並存儲這些子問題的解決方案,以便在需要時重複使用它們。

以下是一個使用動態規劃解決最長回文子串問題的Java代碼示例:

public class LongestPalindromicSubstring {
    public static int lengthOfLongestPalindrome(String s) {
        int n = s.length();
        int[][] dp = new int[n][n];
        return dfs(s, 0, 0, dp);
    }

    private static int dfs(String s, int i, int max, int[][] dp) {
        if (i < 0) return 0;
        if (i == 0) return 1;
        if (s.charAt(i) != s.charAt(Math.abs(i) - 1)) return 1;
        int len = Math.abs(i);
        if (dp[i][len] > 0) return dp[i][len];
        int res = 2;
        for (int j = len - 1; j >= 0; j--) {
            if (s.charAt(Math.abs(i) - 1 - j) == s.charAt(i - j)) {
                res = Math.max(res, len + dfs(s, i - j, len, dp));
            }
        }
        dp[i][len] = res;
        return res;
    }
}

在這個代碼中,我們首先創建一個二維數組dp,其大小與輸入字元串s相同。數組中的每個元素dp[i][j]代表s從索引i到索引j(包括i和j)的最大回文子串的長度。

在dfs函式中,我們首先處理邊界情況:如果我們在字元串的開頭或者已經檢查了兩個字元不匹配的情況,我們就可以立即返回。如果字元本身相同,我們只需檢查這個字元是否能與當前回文子串的其他部分形成回文子串。

如果字元不相同,我們就嘗試所有可能的偏移量j(從大到小),檢查是否能形成回文子串。如果能形成,我們就更新最大長度res。

最後,我們返回res作為最長回文子串的長度。這就是我們的主要動態規劃方法。