用动态规划思想解决回文串问题
回文串问题,我们其实优选的算法是中心扩展算法,但有些题目我们用动态规划思想去解决更简单。
我们用一道题来引入这个算法思想。

我们的思想是,把所有子串是否为回文的信息,全都保存在dp表里(On²)
我们假设到i位置开始,记录所有以i开头的所有字串,也就是来一个j在i后依次遍历。i到下一个位置时,j不必从0开始走,只需要从i之后走即可。
我们的dp表是二维数组,i表示横坐标j表示纵坐标。我们发现只需要填充数组的上三角部分即可。
dp[i][j],表示s字符串[i,j]的字串是否是回文串。
状态转移方程:dp[i][j]:如果s[i]不等于s[j]直接false;如果s[i]==s[j]又有以下几种情况。如果i==j或i+1==j直接为true,要么就是dp[i+1][j-1]。它要是true就是true否则为false;
这次的填表顺序是从下往上填表(数组方向)
最后看数组中true的数量即可。
int countSubstrings(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n));int ret=0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j])dp[i][j]=i+1<j?dp[i+1][j-1]:true;if(dp[i][j])ret++;}}return ret;}