代码随想录算法训练营第四十四天| 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 }

 

posted @ 2023-08-02 20:58  博二爷  阅读(4)  评论(0编辑  收藏  举报