647. 回文子串
题目链接:647. 回文子串
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰回文子串
日期:2024-10-19
想法:本题精髓在于dp[i][j]表示的是s[i,j]这个子字符串是不是回文的,是Boolean类型,s[i]s[j]不等时,肯定不回文;s[i]s[j]相等时,开始看ij的大小,ij大小相等那么表示单个字符的情况,回文,大小差距为1,表示的是像“aa”这种情况,回文;大小差距大于1了,就得看这两个字符中间的子串是不是回文的了即看dp[i + 1][j - 1]是不是为true;初始化当然起始全部都是false;遍历顺序还有要注意由于有dp[i + 1][j - 1],所以列得从下往上走,行还是继续从左往右就行了。
Java代码如下:
class Solution {
public int countSubstrings(String s) {
char[] chars = s.toCharArray();
int res = 0;
int len = chars.length;
boolean[][] dp = new boolean[len][len];
for(int i = len - 1; i >= 0; i--) {
for(int j = i; j < len; j++) {
if(chars[i] == chars[j]) {
if(j - i <= 1) {
dp[i][j] = true;
res++;
}else if(dp[i + 1][j - 1]){
dp[i][j] = true;
res++;
}
}
}
}
return res;
}
}
516.最长回文子序列
题目链接:516.最长回文子序列
文档讲解︰[代码随想录(programmercarl.com)](https://programmercarl.com/0516.最长回文子序列.html)
视频讲解︰最长回文子序列
日期:2024-10-19
想法:dp[i][j]表示s区间[i,j]中得最长子序列长度,跟上面字串是不一样的;s[i]s[j]相等,原长度dp[i + 1][j - 1]加2,不相等,就看是不要前一个长还是不要后一个长,即dp[i + 1][j]dp[i][j - 1];初始化显然dp[i][i]区间只有一个字符时长度为1;遍历顺序跟上面一样。
Java代码如下:
class Solution {
public int longestPalindromeSubseq(String s) {
char[] chars = s.toCharArray();
int len = chars.length;
int[][] dp = new int[len][len];
for(int i = 0; i < len; i++) {
dp[i][i] = 1;
}
for(int i = len - 1; i >= 0; i--) {
for(int j = i + 1; j < len; j++) {
if(chars[i] == chars[j]) {
dp[i][j] = dp[i + 1][j - 1] + 2;
}else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][len - 1];
}
}
标签:子串,int,chars,随想录,len,647,dp,回文
From: https://www.cnblogs.com/wowoioo/p/18486521