62. 不同路径
比较板子的dp,实际上就是到达一个点有两种方式,从上面来或者是左边,加起来就可以了
class Solution {public int uniquePaths(int m, int n) {int [][]arr = new int[m+2][n+2];arr[1][1]=1;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(i==1&&j==1){continue;}arr[i][j]+=arr[i-1][j]+arr[i][j-1];}}return arr[m][n];}
}
64. 最小路径和
跟上一题一样,该题取一下最小值即可
class Solution {public int minPathSum(int[][] grid) {if(grid.length==0){return 0;}for(int i=0;i<grid.length ; i ++){for(int j=0;j<grid[i].length;j++){if(i>0&&j>0){grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]);}else if(i==0){if(j>0){grid[i][j]+=grid[i][j-1];}}else if(j==0){if(i>0){grid[i][j]+=grid[i-1][j];}}}}return grid[grid.length-1][grid[grid.length-1].length-1];}
}
5. 最长回文子串
这边直接采取的暴力的做法,枚举每一个字符串,看看是不是回文的即可
class Solution {public static String longestPalindrome(String s) {int wei=0;int len=1;char []arr=s.toCharArray();for(int i=0;i<arr.length;i++){for(int j=i;j<arr.length;j++){int f=(j-i);int mark=0;for(int p=0;p<=f;p++){if(arr[i+p]!=arr[j-p]){mark=1;break;}}if(mark==0){if(j-i+1>=len){len=j-i+1;wei=i;}}}}String s2=s.substring(wei,wei+len);return s2;}
}
1143. 最长公共子序列
也算是比较板子的dp了,我们设dp[i][j]为以i和j为结尾的最长子序列,它实际上有两种可能,一个是i和j对应的字符相等,那么直接就是i-1,j-1加1即可,如果不同,就是i-1,j,或者i,j-1转移过来即可
class Solution {public static void main(String[] args) {longestCommonSubsequence("abcde","ace");}public static int longestCommonSubsequence(String text1, String text2) {int len=0;char []s2=text2.toCharArray();char []s1=text1.toCharArray();int [][]dp=new int[text1.length()][text2.length()];int maxx=0;for(int i=0;i<s1.length;i++){for(int j=0;j<s2.length;j++){if(s1[i]==s2[j]){if(i>=1&&j>=1){dp[i][j]=Math.max(dp[i-1][j-1]+1,dp[i][j]);}else{dp[i][j]=1;}}else{if(i>=1){dp[i][j]=Math.max(dp[i-1][j],dp[i][j]);}if(j>=1){dp[i][j]=Math.max(dp[i][j-1],dp[i][j]);}}maxx=Math.max(dp[i][j],maxx);}}return maxx;}}
72. 编辑距离
与上一题几乎一致,看一下代码即可
import java.util.*;import static java.util.Collections.reverse;public class Main {public static void main(String[] args) {minDistance("abcde","ace");}public static int minDistance(String word1, String word2) {int len1 = word1.length(), len2 = word2.length();int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 0; i < len1; i++)dp[i + 1][0] = i + 1;for (int i = 0; i < len2; i++)dp[0][i + 1] = i + 1;for (int i = 0; i < len1; i++) {for (int j = 0; j < len2; j++) {dp[i + 1][j + 1] = word1.charAt(i) == word2.charAt(j) ? dp[i][j]: Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;}}return dp[len1][len2];}}