From ac55070575c06192f6caf8923c0b3b6aeeb208e6 Mon Sep 17 00:00:00 2001 From: huayu <674367665@qq.com> Date: Sun, 26 Jun 2022 15:14:29 +0800 Subject: [PATCH] =?UTF-8?q?20.=E6=9A=B4=E5=8A=9B=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=88=B0=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=EF=BC=88=E4=BA=8C?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learn/learn/tixi/twentieth/ArrToString.java | 144 ++++++++++++++++++ .../learn/learn/tixi/twentieth/BagMaxValue.java | 63 ++++++++ .../twentieth/LongestCommonSubsequence.java | 69 +++++++++ .../learn/tixi/twentieth/NumberConvert.java | 60 ++++++++ .../learn/体系/20.暴力递归到动态规划(二).md | 27 ++++ 5 files changed, 363 insertions(+) create mode 100644 算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java create mode 100644 算法/learn/src/main/java/com/learn/learn/tixi/twentieth/BagMaxValue.java create mode 100644 算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java create mode 100644 算法/learn/src/main/java/com/learn/learn/tixi/twentieth/NumberConvert.java create mode 100644 算法/learn/体系/20.暴力递归到动态规划(二).md diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java new file mode 100644 index 0000000..779dbe0 --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/ArrToString.java @@ -0,0 +1,144 @@ +package com.learn.learn.tixi.twentieth; + +import java.util.HashMap; +// https://leetcode.com/problems/stickers-to-spell-word/ +public class ArrToString { + public static int minStickers1(String[] stickers,String target){ + int ans = process1(stickers,target); + return ans==Integer.MAX_VALUE?-1:ans; + } + + /* + 所有贴纸stickers,每一张贴纸都有无穷张 + target + 最少张数 + */ + private static int process1(String[] stickers, String target) { + if (target.length()==0){ + return 0; + } + int min = Integer.MAX_VALUE; + // 每张贴纸被剪无数次还剩多少 + for (String first:stickers){ + String rest = minus(target,first); + if (rest.length()!=target.length()){ + min=Math.min(min,process1(stickers,rest)); + } + } + return min+(min == Integer.MAX_VALUE?0:1); + } + + private static String minus(String s1, String s2) { + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + int[] count = new int[26]; + for (char cha:str1){ + count[cha-'a']++; + } + for (char cha:str2){ + count[cha-'a']--; + } + StringBuilder builder = new StringBuilder(); + for (int i = 0;i<26;i++){ + if (count[i]>0){ + for (int j=0;j所有的贴纸 + // 每一种贴纸都有无穷张 + // 返回搞定target的最少张数 + public static int process2(int[][] stickers,String t){ + if (t.length()==0){ + return 0; + } + char[] target=t.toCharArray(); + int[] tcounts= new int[26]; + for (char cha:target){ + tcounts[cha-'a']++; + } + int n = stickers.length; + int min = Integer.MAX_VALUE; + for (int i = 0;i0){ + StringBuilder builder = new StringBuilder(); + for (int j=0;j<26;j++){ + if (tcounts[j]>0){ + int nums = tcounts[j]-sticker[j]; + for (int k = 0;k dp = new HashMap<>(); + dp.put("",0); + int ans = process3(counts,target,dp); + return ans == Integer.MAX_VALUE?-1:ans; + } + + private static int process3(int[][] stickers, String t, HashMap dp) { + if (dp.containsKey(t)){ + return dp.get(t); + } + char[] target = t.toCharArray(); + int[] tcounts = new int[26]; + for (char cha:target){ + tcounts[cha-'a']++; + } + int n=stickers.length; + int min = Integer.MAX_VALUE; + for (int i=0;i0){ + StringBuilder builder = new StringBuilder(); + for (int j= 0 ;j<26;j++){ + if (tcounts[j]>0){ + int nums= tcounts[j]-sticker[j]; + for (int k=0;k=0;index--){ + for (int rest = 0;rest<=bag;rest++){ + int p1 = dp[index+1][rest]; + int p2=0; + int next = rest-w[index]<0?-1:dp[index+1][rest-w[index]]; + if (next!=-1){ + p2 = v[index]+next; + } + dp[index][rest]=Math.max(p1,p2); + } + } + + return dp[0][bag]; + } +} diff --git a/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java new file mode 100644 index 0000000..5807c6c --- /dev/null +++ b/算法/learn/src/main/java/com/learn/learn/tixi/twentieth/LongestCommonSubsequence.java @@ -0,0 +1,69 @@ +package com.learn.learn.tixi.twentieth; +// https://leetcode.cn/problems/longest-common-subsequence/ +public class LongestCommonSubsequence { + + public static int longestCommonSubsequence(String s1,String s2){ + if (s1==null||s2==null||s1.length()==0||s2.length()==0){ + return 0; + } + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + return process1(str1,str2,str1.length-1,str2.length-1); + } + public static int process1(char[] str1,char[] str2,int i,int j){ + if (i==0&&j==0){ + return str1[i]==str2[j]?1:0; + }else if (i==0){ + if (str2[j]==str1[i]){ + return 1; + }else { + process1(str1,str2,i,j-1); + } + }else if (j==0){ + if (str2[j]==str1[i]){ + return 1; + }else { + process1(str1,str2,i-1,j); + } + }else { + // 样本对应,结尾该如何组织可能性 + // 不以i结尾可能以j结尾, + int p1 = process1(str1,str2,i-1,j); + // 即以i结尾也不以j结尾, + int p2 = process1(str1,str2,i,j-1); + // 即以i结尾又以j结尾 + int p3 = str1[i]==str2[j]?(1+process1(str1,str2,i-1,j-1)):0; + return Math.max(p1,Math.max(p2,p3)); + } + return 0; + } + + public static int longestCommonSubsequence2(String s1,String s2){ + if (s1==null||s2==null||s1.length()==0||s2.length()==0){ + return 0; + } + char[] str1 = s1.toCharArray(); + char[] str2 = s2.toCharArray(); + int n= str1.length; + int m = str2.length; + int [][] dp = new int[n][m]; + dp[0][0]=str1[0]==str2[0]?1:0; + for (int j=1;j=0;i--){ + if (strChar[i]!='0'){ + int ways=dp[i+1]; + if (i + 1 < strChar.length &&(strChar[i]-'0')*10+strChar[i+1]-'0'<27) { + ways+=dp[i+2]; + } + dp[i]=ways; + } + } + return dp[0]; + } + +} diff --git a/算法/learn/体系/20.暴力递归到动态规划(二).md b/算法/learn/体系/20.暴力递归到动态规划(二).md new file mode 100644 index 0000000..9f05e4b --- /dev/null +++ b/算法/learn/体系/20.暴力递归到动态规划(二).md @@ -0,0 +1,27 @@ +### 背包问题 +重量数组w[] +价值数据v[] +bag maxvalue int +自由挑选货物,让背包里装的货物最多 + +### 数字对应 +规定1对应A,2对应B,3对应C,·····,26对应Z, +那么一个数字字符串比如‘111’就可以转换为‘AAA’,‘KA’和‘AK’ +给定一个只有数字字符串组成的字符串str,返回对少中转换结果 +### 数组转字符串 +给定一个字符串str,给定一个字符串类型的数组arr, +出现的字符都是小写英文arr每一个字符串,代表一张贴纸, +你可以把当个字符剪开使用,目的是拼出来str来返回需要至少 +多少贴纸可以完成任务。 +例子:str="babac",arr={"ba","c","abcd"} +至少需要两张贴纸"ba"和"abcd",因为使用这两张贴纸, +把每一个字符串单独剪开,含有2个a、2个b、1个c。是可以 +拼出str的。所以返回2 +### 最长公共子序列 +样本对应模型: + +### 模型 +1. 从左往右尝试 +2. 范围尝试 +3. 样本对应模型 +4. 业务限制模型 \ No newline at end of file