leetcode647. 回文子串(动态规划)

125 阅读1分钟

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。

示例 1:

输入: “abc”
输出: 3
解释: 三个回文子串: “a”, “b”, “c”.

解题思路

数组含义:dp[i][j]代表字符串s[i…j]是否回文
状态转移:当s[i]==s[j]时,如果当前字符串长度是1或者2,则满足回文条件,或者处于i和j之间的字符串是回文字符串,同样满足条件

代码

class Solution {
    public int countSubstrings(String s) {

        int n=s.length(),res=0;
        boolean[][] dp=new boolean[n][n];
        for(int i=0;i<n;i++)
            for(int j=i;j>=0;j--)
                if(s.charAt(i)==s.charAt(j)&&(i-j<2||dp[i-1][j+1]))
                {
                    dp[i][j]=true;
                    res++;
                }
        return res;
    }
}