题目描述链接:https://leetcode-cn.com/problems/palindromic-substrings/
解题思路:此题和本站中的最长子串的解法一致,只需将判断出的回文子串的个数记录,最后返回即可。
可以参考此篇文章 https://www.cnblogs.com/zzw-/p/13406062.html
同样其解题步骤如下:
(1)状态表示:dp[i][j]=0标识s[i]到s[j]这个子序列不为回文子串,dp[i][j]=1标识其为回文子串
(2)边界表示:对于长度为1的子串肯定为回文子串即dp[i][i]=1,长度为2的子串dp[i][i+1]= (s[i]==s[i+1])
(3)状态转移方程:dp[i][j]=(s[i]==s[j]&&dp[i+1][j-1]) 需要注意我们这里动态规划的顺序应为从子串的长度递增的顺序,即先判断子串长度为1的,然后判断长度为2的,一直到整个长度。
最后把每次求得的dp[i][j]如果为一表示其为回文子串,计数器加一,最后将计数器的结果返回即为此题答案。
LeetCode C++求解参考代码如下:
class Solution { public: int countSubstrings(string s) { int len=s.size(); bool dp[len][len]; int ans=0; for(int ll=0;ll<len;ll++){ for(int i=0;i+ll<len;i++){ int j=i+ll; if(ll==0){ dp[i][j]=1; } else if(ll==1){ dp[i][j]=s[i]==s[j]; } else{ dp[i][j]=((s[i]==s[j])&&(dp[i+1][j-1])); } if(dp[i][j]==1){ ans++; } } } return ans; } };