1.不同路径、最长公共子序列
不同路径
public int uniquePaths(int m, int n) {
int[][] A= new int[m][n];
// 初始化列
for(int i = 0 ; i < m ; i++) {
A[i][0] = 1;
}
// 初始化行
for(int j = 0 ; j < n ; j++) {
A[0][j] = 1;
}
for(int i = 1 ; i < m ; i++) {
for(int j = 1 ; j < n ; j++) {
// 递推公式
A[i][j] = A[i-1][j] + A[i][j-1];
}
}
return A[m-1][n-1];
}
> 优化
public int uniquePaths(int m, int n) {
int[] cur = new int[n];
// 一行初始化为1
Arrays.fill(cur,1);
for (int i = 1;i < m;i++) {
for (int j = 1;j < n;j++) {
// 逐行进行递推
cur[j] += cur[j - 1];
}
}
return cur[n - 1];
}
public int uniquePathsWithObstacles(int[][] A) {
int m = A.length;
int n = A[0].length;
int step[][] = new int[m][n];
// 初始化第一列,只要碰到一个1,那么后边都无法走到
for (int i = 0; i < m; i++) {
if (A[i][0] == 1) {
break;
}
step[i][0] = 1;
}
// 初始化第一行,只要碰到一个1,那么后边都无法走到
for (int j = 0; j < n; j++) {
if (A[0][j] == 1) {
break;
}
step[0][j] = 1;
}
// 在没有障碍物的情况下,到达某一点只能从左边或者上边
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
step[i][j] = A[i][j] == 1 ? 0 : step[i - 1][j] + step[i][j - 1];
}
}
return step[m - 1][n - 1];
}
> 优化
public int uniquePathsWithObstacles(int[][] A) {
int width = A[0].length;
int[] dp = new int[width];
// 假设没有障碍
dp[0] = 1;
for (int[] row : A) {
for (int j = 0; j < width; j++) {
if (row[j] == 1)
// 有障碍再置0
dp[j] = 0;
else if (j > 0)
dp[j] += dp[j - 1];
}
}
return dp[width - 1];
}
最长公共子序列
https://leetcode-cn.com/problems/longest-common-subsequence/
public int longestCommonSubsequence(String text1, String text2) {
// s1 = ".....A" , s2 = "......A"
// 两个字符串分别从后往前看
// 若当前位置不等,则max(dp[s1-1,s2],dp[s1,s2-1])
// 若当前位置相等,则dp[s1-1,s2-1]+1;
int m = text1.length();
int n = text2.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = 1;i <= m;i++) {
for (int j = 1;j <= n;j++) {
if (text1.charAt(i - 1) != text2.charAt(j - 1)) {
dp[i][j] = Math.max(dp[i - 1][j] , dp[i][j - 1]);
} else {
dp[i][j] =dp[i - 1][j - 1] + 1;
}
}
}
return dp[m][n];
}

浙公网安备 33010602011771号