最长回文子序列
leetcode516. 最长回文子序列
题目描述
暴力递归
解题思路
代码演示
public static int longestPalindromeSubseq(String s) {
if (s == null || s.length() == 0){
return 0;
}
int[][] ans = new int[s.length()][s.length()];
return process(s.toCharArray(),0,s.length()-1,ans);
// return process(s.toCharArray(),0,s.length()-1);
}
/**
* 递归
* @param s 字符数组
* @param L 左指针
* @param R 右指针
* @return
*/
public static int process(char[] s,int L,int R){
//base case
if(L > R){
return 0;
}
//base case 单个字符肯定是回文 返回1
if(L == R){
return 1;
}
int p1 = 0;
int p2 = 0;
int p3 = 0;
//相等时 同时移动
if(s[L] == s[R]){
p1 = 2 + process(s,L + 1,R - 1);
}else{
//不等时分两种情况,最后要最大值
p2 = process(s,L + 1,R);
p3 = process(s,L,R - 1);
}
return Math.max(p1,Math.max(p2,p3));
}
递归 + 缓存
解题思路
代码演示
public static int longestPalindromeSubseq(String s) {
if (s == null || s.length() == 0){
return 0;
}
int[][] ans = new int[s.length()][s.length()];
return process(s.toCharArray(),0,s.length()-1,ans);
// return process(s.toCharArray(),0,s.length()-1);
}
/**
* 递归加 缓存
* @param s 字符数组
* @param L 左指针
* @param R 右指针
* @param dp 缓存表
* @return
*/
public static int process(char[] s,int L,int R,int[][]dp){
//base case
if(L > R){
return 0;
}
if(L == R){
return 1;
}
//缓存中有的话 直接缓存拿
if(dp[L][R] != 0){
return dp[L][R];
}
int p1 = 0;
int p2 = 0;
int p3 = 0;
if(s[L] == s[R]){
p1 = 2 + process(s,L + 1,R - 1,dp);
}else{
p2 = process(s,L + 1,R,dp);
p3 = process(s,L,R - 1,dp);
}
int ans = Math.max(p1,Math.max(p2,p3));
//结果加到缓存中
dp[L][R] = ans;
return ans;
}
动态规划
解题思路
代码演示
/**
* 动态规划
* @param s
* @return
*/
public static int dp(String s){
char[] chars = s.toCharArray();
int N = chars.length;
int[][] ans = new int[N][N];
//base case 去初始化
for (int i = 0; i < N ;i++){
ans[i][i] = 1;
}
//根据递归过程去填值
for (int i = 1;i < N ;i++){
int R = i;
int L = 0;
while (R < N){
int p1 = 0;
int p2 = 0;
int p3 = 0;
if (chars[L] == chars[R]){
p1 = 2 + ans[L + 1][R - 1];
}else{
p2 = ans[L + 1][R];
p3 = ans[L][R - 1];
}
ans[L][R] = Math.max(p1,Math.max(p2,p3));
L++;
R++;
}
}
//返回调用的最初始状态。
return ans[0][N - 1];
}
动态规划专题
leetcode1143. 最长公共子序列
leetcode.486. 预测赢家
动态规划.背包问题–填满背包的最大价格
leetcode–N 皇后 II