我國高階輸電技術首次進入歐洲:國網智研院中標德國海上風電柔性直流輸電工程
阿新 • • 發佈:2022-02-20
動態規劃
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) */