动态规划---回文子串
题目:
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
思路:
1.确定dp数组及含义
dp[i][j]代表字符串区间[i,j](左闭右闭)的字符是不是回文子串(true,false)
2.确定递推公式
如果s[i]!=s[j],一定不是回文子串,dp[i][j]=false
如果s[i]=s[j],要分情况讨论:
(1)j-i=0,是回文子串,dp[i][j]=true
(2)j-i=1,是回文子串,dp[i][j]=true
(3)j-i>1,要确定区间[i+1,j-1]的字符串是不是回文子串,如果是,那么dp[i][j]=true
3.初始化dp数组
全部初始化为false
4.确定遍历顺序
根据递推公式,需要从下到上,从左到右遍历
代码:
public int countSubstrings(String s) {
int len=s.length();
char[] chars=s.toCharArray();
boolean[][] dp=new boolean[len][len];
int result=0;
for(int i=len-1;i>=0;i--){
for(int j=i;j<len;j++){
if(chars[i]==chars[j]){
if(j-i<=1){
result++;
dp[i][j]=true;
}
else if(dp[i+1][j-1]==true){
result++;
dp[i][j]=true;
}
}
}
}
return result;
}