1. 程式人生 > 資訊 >我國高階輸電技術首次進入歐洲:國網智研院中標德國海上風電柔性直流輸電工程

我國高階輸電技術首次進入歐洲:國網智研院中標德國海上風電柔性直流輸電工程

動態規劃

class Solution {
    public int countSubstrings(String s) {

        /**
         * dp[i][j]定義為區間為[i, j]的子串是否是迴文串
         * 記錄下前面區間的狀態,不用每次都呼叫迴文串判斷方法
         */
        boolean[][] dp = new boolean[s.length()][s.length()];
        int count = 0;

        for (int j = 0; j < s.length(); j++) {

            for (int i = 0; i <= j; i++) {

                /**
                 * 如果i和j的字元相等,且i和j是同一個字元或者是相鄰字元,或者i往右縮一步,j往左縮一步得到的字串也是迴文串
                 * 就可以確定[i, j]區間也是迴文串
                 */
                if (s.charAt(i) == s.charAt(j) && (j - i <= 1 || dp[i + 1][j - 1])){

                    count++;
                    dp[i][j] = true;
                }
            }
        }

        return count;
    }
}

/**
 * 時間複雜度 O(n^2)
 * 空間複雜度 O(n^2)
 */

暴力解法

class Solution {
    public int countSubstrings(String s) {

        /**
         * 三層迴圈
         * 對於每個字元本身都是迴文串,因此初始數量為字串長度
         * 對於每個字元i,用一個從0開始的指標j一次遍歷,只要[j, i]區間內的子串是迴文串,總數就加1
         */
        int count = s.length();

        for (int i = 0; i < s.length(); i++) {

            for (int j = 0; j < i; j++) {

                if (isValid(s.substring(j, i + 1))){
                    count++;
                }
            }
        }

        return count;
    }

    /**
     * 判斷迴文串
     */
    public boolean isValid(String s){

        int left = 0;
        int right = s.length() - 1;

        while (left < right){

            if (s.charAt(left) == s.charAt(right)){

                left++;
                right--;
            }
            else {
                return false;
            }
        }

        return true;
    }
}

/**
 * 時間複雜度 O(n^3)
 * 空間複雜度 O(1)
 */

https://leetcode-cn.com/problems/palindromic-substrings/