最长公共子序列
leetcode1143. 最长公共子序列
题目描述
暴力递归
解题思路
代码演示
public int longestCommonSubsequence(String text1, String text2) {
if (text1 ==null || text2 == null || text2.length() == 0 || text1.length() == 0){
return 0;
}
return process(text1.toCharArray(),text2.toCharArray(),text1.length() - 1,text2.length() - 1);
}
/**
*
* @param str1 字节数组
* @param str2 字节数组
* @param i 字节数组str1 的下标
* @param j 字节数组str2 的下标
* @return
*/
public static int process(char[]str1,char[]str2,int i,int j ){
//base case 都在0 位置
if(i == 0 && j == 0){
return str1[i] == str2[j] ? 1 : 0;
}else if (i == 0){
//i 来到 0 位置 相等直接返回1 不等还要继续移动str2 的指针就行比较有没有相同的
if(str1[i] == str2[j]){
return 1;
}else{
return process(str1,str2,i,j - 1);
}
} else if (j == 0) {
//j来到 0 位置 相等直接返回1 不等还要继续移动str1 的指针就行比较有没有相同的
if(str1[i] == str2[j]){
return 1;
}else{
return process(str1,str2,i - 1,j);
}
}else {
int p1 = 0;
int p2 = 0;
int p3 = 0;
if(str1[i] != str2[j]){
//不等时 str1 的指针和 str2 的指针 分两种情况
//分别进行比较
p1 = process(str1,str2,i,j - 1);
p2 = process(str1,str2,i - 1,j );
}else{
//相等时 同时移动 子序列加1
p3 = 1 + process(str1,str2,i - 1,j - 1);
}
return Math.max(p1,Math.max(p2,p3));
}
}
动态规划
解题思路
代码演示
/**
* 动态规划
* @param text1
* @param text2
* @return
*/
public static int dp(String text1, String text2){
char[] str1 = text1.toCharArray();
char[] str2 = text2.toCharArray();
int N = str1.length;
int M = str2.length;
int[][]dp = new int[N][M];
//根据base case 初始化
dp[0][0] = str1[0] == str2[0] ? 1 : 0;
//str1 来到 0 位置时
for (int j = 1; j < M ;j++){
dp[0][j] = str1[0] == str2[j] ? 1 : dp[0][j - 1];
}
//str2 来到 0 位置时
for (int i = 1;i < N ;i++){
dp[i][0] = str1[i] == str2[0] ? 1 : dp[i - 1][0];
}
for (int i = 1;i < N ;i++){
for (int j = 1;j < M ;j++){
int p1 = 0;
int p2 = 0;
int p3 = 0;
if(str1[i] != str2[j]){
p1 = dp[i][j - 1];
p2 = dp[i - 1][j];
}else{
p3 = 1 + dp[i -1][j - 1];
}
dp[i][j] = Math.max(p1,Math.max(p2,p3));
}
}
//返回递归调用的最初始状态
return dp[N - 1][M - 1];
}
动态规划专题
leetcode.486. 预测赢家
数字转字符串,有多少种转化结果
背包问题–填满背包的最大价格
leetcode 322 题 零钱兑换