Dynamic Programming学习笔记 (17) - 回文子串数量 (力扣# 647)

144 阅读1分钟

回文子串数量问题是最长回文子串问题的扩展,题面为

给定一个长度为N的字符串 s ,返回这个字符串中所有回文子串的数目。

实例如下:

s = "abac"
答案是5个回文子串: "a""b""a""c""aba"      

解题思路:

将最长回文子串的解法稍作修改就可以用于这个问题,我们使用相同的DP数组结构和计算过程,并使用一个变量来保存找到的回文子串数量。

Java代码如下:

class Solution {
    public int countSubstrings(String s) {
        char[] chars = s.toCharArray();
        int N = chars.length;

        if (N <= 1) {
            return N;
        }

        int count = 0;

        boolean[][] dp = new boolean[N + 1][N + 1];

        for (int i = N; i >= 1; i --) {
            dp[i][i] = true;
            count ++;
            for (int j = i + 1; j <= N; j ++) {
                if ((chars[i - 1] == chars[j - 1])) {
                    if ( j - i <= 2  || dp[i + 1][j - 1]) {
                        dp[i][j] = true;
                        count ++;
                    }
                }
            }
        }

        return count;
    }
}