647. 回文子串 516. 最长回文子序列
原创
©著作权归作者所有:来自51CTO博客作者龙崎流河的原创作品,请联系作者获取转载授权,否则将追究法律责任
647. 回文子串
动态规划:
dp[i][j] 表示字符串下标从i到j是否是回文字符串
时间空间复杂度都是n ^ 2
class Solution {
public int countSubstrings(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
int result = 0;
for(int i = 0;i < s.length();i++){
for(int j = 0;j <= i;j++){
if(s.charAt(i) == s.charAt(j)){
if(i - j < 3){
dp[i][j] = true;
}else{
dp[i][j] = dp[i-1][j+1];
}
}else{
dp[i][j] = false;
}
}
}
for(int i = 0;i < s.length();i++){
for(int j = 0;j < s.length();j++){
if(dp[i][j] == true)result++;
}
}
return result;
}
}
为降低空间复杂度使用中心扩散法:
分成两种扩散,一种是中心点是一个元素的扩散,奇数个数的回文字符串,另一种是中心点是两个元素的扩散,偶数个数的回文字符串。
class Solution {
public int countSubstrings(String s) {
int result = 0;
for(int i = 0;i < s.length();i++){
result += extend(s,i,i);
result += extend(s,i,i+1);
}
return result;
}
int extend(String s,int i,int j){
int res = 0;
while(i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)){
res++;
i--;
j++;
}
return res;
}
}
516. 最长回文子序列
dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。
仔细看下图遍历过程理解
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], Math.max(dp[i][j], dp[i][j - 1]));
}
}
}
return dp[0][s.length()-1];
}
}