leetcode-zgd-day55-392.判断子序列/115.不同的子序列/1710.卡车上的最大单元数

69 阅读1分钟

392.判断子序列

题目链接:392. 判断子序列 - 力扣(Leetcode)

解题思路:

 class Solution {
     public boolean isSubsequence(String s, String t) {
         /**
          * 动态规划
          */
         if(s.length() == 0) return true;
         if(t.length() == 0) return false;
         int[][] dp = new int[s.length()][t.length()];
         int rcd = 0;
         for(int i = 0; i < s.length(); i++){
             if(rcd == 0 && s.charAt(i) == t.charAt(0)) rcd = 1;
             dp[i][0] = rcd;
         }
         rcd = 0;
         for(int i = 0; i < t.length(); i++){
             if(rcd == 0 && t.charAt(i) == s.charAt(0)) rcd = 1;
             dp[0][i] = rcd;
         }
         for(int i = 1; i < s.length(); i++){
             for(int j = 1; j < t.length(); j++){
                 if(s.charAt(i) == t.charAt(j)) dp[i][j] = dp[i - 1][j - 1] + 1;
                 else dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
             }
         }
         return dp[s.length() - 1][t.length() - 1] == s.length();
     }
 }

115.不同的子序列

题目链接:115. 不同的子序列 - 力扣(Leetcode)

解题思路:

 class Solution {
     public int numDistinct(String s, String t) {
         /**
          * 1. dp[i][j] 下标0-i的字符串s的子序列中出现下标0-j的字符串t的个数
          * 2. if(s.charAt(i) == t.charAt(j)) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
          *    else dp[i][j] = dp[i - 1][j];
          * 3. if(s.charAt(0) == t.charAt(0)) dp[0][0] = 1;
          *    dp[i][0] = s[i]前面t[0]出现的次数
          */
         int[][] dp = new int[s.length()][t.length()];
         int rcd = 0;
         for(int i = 0; i < s.length(); i++){
             if(s.charAt(i) == t.charAt(0)){
                 rcd++;
             }
             dp[i][0] = rcd;
         }
         for(int i = 1; i < s.length(); i++){
             for(int j = 1; j < t.length(); j++){
                 if(s.charAt(i) == t.charAt(j)) dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
                 else dp[i][j] = dp[i - 1][j];
             }
         }
         return dp[s.length() - 1][t.length() - 1];
     }
 }

1710.卡车上的最大单元数

题目链接:1710. 卡车上的最大单元数 - 力扣(Leetcode)

解题思路:

掌握数组的排序方法,new比较器或者lambda表达式

 class Solution {
     public int maximumUnits(int[][] boxTypes, int truckSize) {
 //      Arrays.sort(boxTypes,new Comparator<int[]>(){
 //          public int compare(int[] a, int[] b){
 //              return b[1] - a[1];
 //          }
 //      });
         Arrays.sort(boxTypes,(int[] a, int[] b)->{
             return b[1] - a[1];
         });
         for(int i = 0; i < boxTypes.length; i++) {
             System.out.println(Arrays.toString(boxTypes[i]));;
         }
         int ans = 0;
         for(int[] b : boxTypes){
             if(b[0] <= truckSize){
                 ans += b[0] * b[1];
                 truckSize -= b[0];
             }else{
                 ans += b[1] * truckSize;
                 break;
             }
         }
         return ans;
     }
 }