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];
}
}