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];}
};