647. 回文子串
解法:代码随想录
题目:- LeetCode
1. dp[i][j] 代表以word从下标i到j是否是回文(左闭右闭)
2. 初始化全部设为false
2. 三种情况:
a) i == j, 直接dp[i][j]等于true eg: a
b) i - j == 1, 直接dp[i][j]等于true eg:aa
c) i - j > 1, 根据dp[i + 1][j - 1]是否是true来判断 -- dp[i][j] == dp[i + 1][j - 1] eg: aaa
class Solution {
public int countSubstrings(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
int res = 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) { //a or aa : scenario 1 or 2
res++;
dp[i][j] = true;
} else if (dp[i + 1][j - 1] == true) { //aaa : scenario 3
res++;
dp[i][j] = true;
}
}
}
}
return res;
}
}
第二种解法用的是2 pointer
1. 从一个单词的每单个字母(奇数length)或者一对字母(偶数length)开始向左右扩展,挨个检查是否回文。
class Solution {
public int countSubstrings(String s) {
int res = 0;
for (int i = 0; i < s.length(); i++) {
res += helper(s, i, i);
res += helper(s, i, i + 1);
}
return res;
}
public int helper(String s, int start, int end) {
int res = 0;
while (start >= 0 && end < s.length() &&
s.charAt(start) == s.charAt(end)) {
res++;
start--;
end++;
}
return res;
}
}
516.最长回文子序列
解法:代码随想录
题目:- LeetCode
1. 如果s[i] == s[j], dp[i][j] = dp[i+1][j-1] + 2;
2. 如果不相等,则取
class Solution {
public int longestPalindromeSubseq(String s) {
int[][] dp = new int[s.length()][s.length()];
for (int i = s.length() - 1; i >= 0; i--) {
dp[i][i] = 1;
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]);
}
//System.out.print(dp[i][j]);
}
//System.out.println(" ");
}
return dp[0][s.length() - 1];
}
}