代码随想录算法训练营第四十天
LeetCode题目:
- 647. 回文子串
- 516. 最长回文子序列
其他:
今日总结
往期打卡
647. 回文子串
跳转: 647. 回文子串
学习: 代码随想录公开讲解
问题:
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
思路:
动态规划,下标的含义是从 x到y 的子串是否是回文串
一个元素是回文串,两个元素只要相等就是回文串
对于这两个特殊情况可以特判 i,j 差值小于2,也可以初始化解决
是连续子串,递推公式为
if(dp[j+1][i-1]&&s.charAt(i)==s.charAt(j)){dp[j][i] = true;
}
为每个回文串计数即可统计出回文子串的数量
复杂度:
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( n 2 ) O(n^2) O(n2)
代码:
class Solution {public int countSubstrings(String s) {int n = s.length();boolean[][] dp = new boolean[n+1][n+1];for(int i=0;i<n;i++){dp[i][i] = true;dp[i+1][i] = true;}int ans = n;for(int i=1;i<n;i++){for(int j=i-1;j>=0;j--){if(dp[j+1][i-1]&&s.charAt(i)==s.charAt(j)){// System.out.println(j+" "+i);dp[j][i] = true;ans++;}}}// for(var arr:dp)// System.out.println(Arrays.toString(arr));return ans;}
}
516. 最长回文子序列
跳转: 516. 最长回文子序列
学习: 代码随想录公开讲解
问题:
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
思路:
下标的含义依然是截取子串
这题求的是最长回文子序列长度
可以让dp数组值为子串中最长回文子序列的长度
从 x+1,y , x,y-1 或从 x+1,y-1的最长回文子序列推导到当前
如果算上x,y还是回文子序列,不管只算一个是不是回文子序列,从不算x和y直接+2肯定是最大的
如果算上x,y不是回文,就要考虑只算x或只算y会不会更大了
复杂度:
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( n 2 ) O(n^2) O(n2)
代码:
class Solution {public int longestPalindromeSubseq(String s) {int n = s.length();int[][] dp = new int[n][n];for(int i=0;i<n;i++){dp[i][i] = 1;}for(int i=1;i<n;i++){for(int j=i-1;j>=0;j--){if(i==j+1||dp[j+1][i-1]>0){if(s.charAt(i)==s.charAt(j))dp[j][i] = dp[j+1][i-1]+2;else dp[j][i] = Math.max(dp[j+1][i-1],Math.max(dp[j][i-1],dp[j+1][i]));}}}return dp[0][n-1];}
}
总结
动态规划章节练习了用递推解决问题
从斐波那契数列,爬楼梯,路径数这种比较明显的连续递推(由固定的前一个或者前几个值推导当前值)
整数拆分(从不拆,拆两半,1块和剩余数的拆分),不同的二叉搜索树(左子树右子树的数量)这种抽象的连续递推
到背包类问题,打家劫舍,股票交易状态机模型,子序列问题,编辑距离问题,回文子串问题.
往期打卡
代码随想录算法训练营第三十九天
代码随想录算法训练营第三十八天
代码随想录算法训练营第三十七天
代码随想录算法训练营第三十五&三十六天
代码随想录算法训练营第三十四天
代码随想录算法训练营第三十三天(补)
代码随想录算法训练营第三十二天
代码随想录算法训练营第三十一天
代码随想录算法训练营第三十天(补)
代码随想录算法训练营第二十九天
代码随想录算法训练营第二十八天
代码随想录算法训练营第二十七天(补)
代码随想录算法训练营第二十六天
代码随想录算法训练营第二十五天
代码随想录算法训练营第二十四天
代码随想录算法训练营第二十三天
代码随想录算法训练营周末四
代码随想录算法训练营第二十二天(补)
代码随想录算法训练营第二十一天
代码随想录算法训练营第二十天
代码随想录算法训练营第十九天
代码随想录算法训练营第十八天
代码随想录算法训练营第十七天
代码随想录算法训练营周末三
代码随想录算法训练营第十六天
代码随想录算法训练营第十五天
代码随想录算法训练营第十四天
代码随想录算法训练营第十三天
代码随想录算法训练营第十二天
代码随想录算法训练营第十一天
代码随想录算法训练营周末二
代码随想录算法训练营第十天
代码随想录算法训练营第九天
代码随想录算法训练营第八天
代码随想录算法训练营第七天
代码随想录算法训练营第六天
代码随想录算法训练营第五天
代码随想录算法训练营周末一
代码随想录算法训练营第四天
代码随想录算法训练营第三天
代码随想录算法训练营第二天
代码随想录算法训练营第一天