题目
给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:
输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
1 <= s.length <= 1000
s 由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/a7VOhD
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
思路:回文字符串的子串一定是回文的,因此想到使用动态规划求解。
dp[j][i]表示字符j...i的字串是否为回文串。
状态转移方程:dp[j][i]=s.charAt(j)==s.charAt(i) (i-j<=2)
dp[j][i]=(s.charAt(j)==s.charAt(i))&&dp[j+1][i-1];
代码:
class Solution {
public int countSubstrings(String s) {
int result=0,n=s.length();
boolean[][] dp=new boolean[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<=i;j++) {
boolean tmp=s.charAt(j)==s.charAt(i);
if(i-j<=2)
dp[j][i]=tmp;
else
dp[j][i]=tmp&&dp[j+1][i-1];
if(dp[j][i]) result++;
}
}
return result;
}
}