647. 回文子串
五部曲:
dp数组下标及含义:
- dp[i][j]:表示区间范围[i,j] 的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
dp数组初始化:
- dp[i][j]初始化为false。
递推公式:
s[i]=s[j]
- 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
- 情况二:下标i 与 j相差为1,例如aa,也是回文子串
- 情况三:下标:i 与 j相差大于1的时候,例如cabac,看区间 [i+1 , j-1]是不是回文
遍历方向: 从后到前,从右到左遍历
class Solution {
public:
int countSubstrings(string s) {
vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));
int result = 0;
for(int i = s.size()-1;i>=0;i--){
for(int j = i;j<s.size();j++){
if(s[i]==s[j]){
if((j-i)<=1){
result++;
dp[i][j]=true;
}
else if(dp[i+1][j-1]){
result++;
dp[i][j]=true;
}
}
}
}
return result;
}
};
516.最长回文子序列
回文子串是要连续的,回文子序列可不是连续的!
五部曲:
dp数组下标及含义:
- dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。
dp数组初始化:
- dp[i][j]初始化为0。
- dp[i][i]初始化为1。
递推公式:
- s[i]=s[j],dp[i][j] = dp[i + 1][j - 1] + 2;
- dp[i][j] = max(dp[i + 1][j], dp[i][j - 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+1][j],dp[i][j-1]);
}
}
}
return dp[0][s.size() - 1];
}
};