代码随想录算法训练营第四十四天| 647. 回文子串 516.最长回文子序列
647. 回文子串
要求:
找出回文子串的个数
思路:
设置起始节点
如果头尾相等,且是相差为1,指定回文
如果相差很多,那么就看它的字串
代码:
1 // 要求:找出 正反相等,且连续字符,开始结束位置不同,也认为是一个 2 // dp[n][n] 起始-中止位置 3 // 4 // 如果两边相等,这两个起始节点相差1个或者0个,那么就直接可以判断是回文 5 // 如果相差很多,需要看i+1 j-1 6 // 7 // 8 int countSubstrings(string s) { 9 if (s.size() == 1) return 1; 10 int result = 0; 11 12 vector<vector<int>>dp(s.size(), vector<int>(s.size(), false)); 13 14 //起始 15 for (int i = s.size()-1; i >=0; i--) 16 { 17 //中止 18 for (int j = i; j < s.size(); j++) 19 { 20 if (s[i] == s[j]) 21 { 22 if (j - i <= 1) 23 { 24 dp[i][j] = true; 25 } 26 else 27 { 28 dp[i][j] = dp[i + 1][j - 1]; 29 } 30 31 if (dp[i][j]) 32 result++; 33 } 34 35 } 36 } 37 38 return result; 39 }
516.最长回文子序列
要求:
如果相等
那么就是中间的+2
如果不相等
那么就保留状态,掠过自己,dp[i+1][j], dp[i][j-1];
代码:
1 // 要求:寻找最长的回文子序列 2 // 3 // 难点: 可以舍弃一些节点 保存之前的状态 4 // dp[n][m] 以起始节点为N 终止节点为M的 最长子序列长度 5 // 6 // 如果不相等 dp[i][j] = dp[i+1][j] 7 // 如果相等 8 // dp[i][j] i==j则1 否则 dp[i][j-1]+1 9 // 10 // 初始化:全0 11 // 12 int longestPalindromeSubseq(string s) { 13 vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0)); 14 15 for (int i = s.size() - 1; i >= 0; i--) 16 { 17 for (int j = i; j < s.size(); j++) 18 { 19 if (s[i] == s[j]) 20 { 21 if (i == j) 22 dp[i][j] = 1; 23 else 24 dp[i][j] = dp[i+1][j - 1] + 2; 25 } 26 else 27 { 28 dp[i][j] = max(dp[i+1][j], dp[i][j-1]); 29 } 30 } 31 } 32 33 return dp[0][s.size() - 1]; 34 }