力扣链接:647.回文子串
题目描述
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = "abc" 输出:3 解释:三个回文子串: "a", "b", "c"
示例 2:
输入:s = "aaa" 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
1 <= s.length <= 1000
s
由小写英文字母组成
解题方法
思路
区间dp题目
①首先确定dp数组含义即dp[i][j]表示i-j区间的最长回文子序列长度
②确定递推公式:如果s[i]==s[j] 最长回文子序列长度+2
否则不算i或不算j两个值中取最大长度
③初始化dp数组
④遍历顺序从下到上,从左到右
⑤题目要求的是dp[0][s.size()-1]的值即该子串的最长回文子序列长度,返回即可
代码
class Solution {
public:
int longestPalindromeSubseq(string s) {
vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
for(int i=0;i<s.size();i++){//初始化
dp[i][i] = 1;
}
for(int i=s.size()-1;i>=0;i--){
for(int j=i+1;j<s.size();j++){
if(s[i]==s[j]) dp[i][j] =dp[i+1][j-1]+2;
else dp[i][j] = max(dp[i][j-1],dp[i+1][j]);
}
}
return dp[0][s.size()-1];
}
};