程式碼隨想錄演算法訓練營 | 647. 迴文子串,516.最長迴文子序列

漪欢酒發表於2024-10-19

647. 迴文子串
題目連結:647. 迴文子串
文件講解︰程式碼隨想錄(programmercarl.com)
影片講解︰迴文子串
日期:2024-10-19

想法:本題精髓在於dp[i][j]表示的是s[i,j]這個子字串是不是迴文的,是Boolean型別,s[i]s[j]不等時,肯定不迴文;s[i]s[j]相等時,開始看ij的大小,ij大小相等那麼表示單個字元的情況,迴文,大小差距為1,表示的是像“aa”這種情況,迴文;大小差距大於1了,就得看這兩個字元中間的子串是不是迴文的了即看dp[i + 1][j - 1]是不是為true;初始化當然起始全部都是false;遍歷順序還有要注意由於有dp[i + 1][j - 1],所以列得從下往上走,行還是繼續從左往右就行了。
Java程式碼如下:

class Solution {
    public int countSubstrings(String s) {
        char[] chars = s.toCharArray();
        int res = 0;
        int len = chars.length;
        boolean[][] dp = new boolean[len][len];
        for(int i = len - 1; i >= 0; i--) {
            for(int j = i; j < len; j++) {
                if(chars[i] == chars[j]) {
                    if(j - i <= 1) {
                        dp[i][j] = true;
                        res++;
                    }else if(dp[i + 1][j - 1]){
                        dp[i][j] = true;
                        res++;
                    }
                }
            }
        }
        return res;
    }
}

516.最長迴文子序列
題目連結:516.最長迴文子序列
文件講解︰[程式碼隨想錄(programmercarl.com)](https://programmercarl.com/0516.最長迴文子序列.html)
影片講解︰最長迴文子序列
日期:2024-10-19

想法:dp[i][j]表示s區間[i,j]中得最長子序列長度,跟上面字串是不一樣的;s[i]s[j]相等,原長度dp[i + 1][j - 1]加2,不相等,就看是不要前一個長還是不要後一個長,即dp[i + 1][j]dp[i][j - 1];初始化顯然dp[i][i]區間只有一個字元時長度為1;遍歷順序跟上面一樣。
Java程式碼如下:

class Solution {
    public int longestPalindromeSubseq(String s) {
        char[] chars = s.toCharArray();
        int len = chars.length;
        int[][] dp = new int[len][len];
        for(int i = 0; i < len; i++) {
            dp[i][i] = 1;
        }

        for(int i = len - 1; i >= 0; i--) {
            for(int j = i + 1; j < len; j++) {
                if(chars[i] == chars[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                }else {
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][len - 1];
    }
}

相關文章