647. Palindromic Substrings
题目链接:647. Palindromic Substrings
思路链接:代码随想录动态规划-回文子串
思路
看代码
Code
class Solution {
public int countSubstrings(String s) {
// 1. 确定dp数组
// 区间为[i, j](左闭右闭)的子字符串是否为回文串,如果是dp[i][j]为true,反之则为false,这里true为1,false为0
int[][] dp = new int[s.length()][s.length()];
// 2. 递推公式
// 1.1 如果s[i]与s[j]相等,有三种情况:
// 1. i == j,是回文串
// 2. i和j相差1,是回文串
// 3. i和j相差大于1,看dp[i + 1][j - 1]是否是回文串
// 1.2 如果s[i]与s[j]不相等,不是回文串,dp[i][j] = false
// if (s.charAt(i) == s.charAt(j)) {
// if (j - i <= 1) {
// result++;
// dp[i][j] = 1;
// } else if (dp[i + 1][j - 1]) {
// result++;
// dp[i][j] = 1;
// }
// } else {
// dp[i][j] = 0;
// }
// 3. 初始化数组: 都是0
// 4. 遍历顺序: 从下往上,从左往右
int result = 0;
for (int i = s.length() - 1; i >= 0; i--) {
for (int j = i; j < s.length(); j++) {
if (s.charAt(i) == s.charAt(j)) {
if (j - i <= 1) {
result++;
dp[i][j] = 1;
} else if (dp[i + 1][j - 1] == 1) {
result++;
dp[i][j] = 1;
}
} else {
dp[i][j] = 0;
}
}
}
// 5. 打印数组
// for (int[] row : dp) {
// for (int item : row) {
// System.out.print(item + " ");
// }
// System.out.println();
// }
return result;
}
}
516. Longest Palindromic Subsequence
题目链接:516. Longest Palindromic Subsequence
思路链接:代码随想录动态规划-最长回文子序列
思路
看代码
Code
class Solution {
public int longestPalindromeSubseq(String s) {
// 1. 确定dp数组
// dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。
int[][] dp = new int[s.length()][s.length()];
// 2. 递推公式
// 如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;
// 如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子串的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。
// 加入s[j]的回文子序列长度为dp[i + 1][j]。
// 加入s[i]的回文子序列长度为dp[i][j - 1]。
// if (s.charAt(i) == s.charAt(j)) {
// dp[i][j] = dp[i + 1][j - 1] + 2;
// } else {
// dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
// }
// 3. 初始化数组:
// i 和 j相等时为1
for (int i = 0; i < s.length(); i++) {
dp[i][i] = 1;
}
// 4. 遍历顺序: 从下往上,从左到右
for (int i = s.length() - 1; i >= 0; i--) {
for (int j = i + 1; j < s.length(); j++) {
if (s.charAt(i) == s.charAt(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][s.length() - 1];
}
}