647. 回文子串

2021-10-27  本文已影响0人  justonemoretry
image.png

解法

动态规划解法

class Solution {
    public int countSubstrings(String s) {
        int n = s.length();
        // i到j是否为回文子串
        boolean[][] dp = new boolean[n][n];
        int res = 0;
        // 递归顺序
        for (int j = 0; j < n; j++) {
            for (int i = 0; i <= j; i++) {
                // 状态转移,i位置等于j,且之前位置是回文串或单个元素
                dp[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 2 || dp[i + 1][j - 1]);
                if (dp[i][j]) {
                    res++;
                }
            }
        }
        return res;
    }
}

中心扩展思想

class Solution {
    public int countSubstrings(String s) {
        int ans = 0;
        int n = s.length();
        // 中心扩展法,所有字符串都能通过一个元素为中心进行两边同时扩展
        // 或者以两个元素为中心,进行两边同时扩展
        for (int i = 0; i < 2 * n - 1; i++) {
            // left总是从中间,偶数是right和left相同,就是一个扩展的情况
            // 奇数时right比left大1,是二个向外扩展的情况
            int left = i / 2;
            int right = left + i % 2;
            while (left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
                ans++;
                left--;
                right++;
            }        
        }
        return ans;
    }
}
上一篇下一篇

猜你喜欢

热点阅读