题目:
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:"abc"
输出:3
解释:三个回文子串: "a", "b", "c"
示例 2:
输入:"aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindromic-substrings
思路: 本题适合用动态规划,用一个二维数组 dp 保存回文串的状态,dp[ i ][ j ] 代表字符串s 下标从i 到下标 j 的子串是否为回文串。
则有状态转移方程:
java 代码如下:
public class Main{
public int countSubstrings(String s) {
int count = 0;
int[][] dp = new int[s.length()][s.length()];
for(int i=0;i<s.length();i++){
dp[i][i] = 1;
count++;
if(i<s.length()-1 && s.charAt(i) == s.charAt(i+1)){
dp[i][i+1] = 1;
count++;
}
}
for(int j = 2;j<s.length();j++){
for(int i=0;i+j<s.length();i++){
if(s.charAt(i) == s.charAt(i+j) && dp[i+1][i+j-1] == 1){
dp[i][i+j] = 1;
count++;
}
}
}
return count;
}
}