package 左神题目.dp;
import java.util.*;
//给定一个字符串str,给定一个字符串类型的数组arr,
// 出现的字符都是小写英文arr每一个字符串,
// 代表一张贴纸,你可以把单个字符剪开使用,
// 目的是拼出str来返回需要至少多少张贴纸可以完成这个任务。
//例子:str="babac”,arr =("ba”,"c”,"abcd"
//至少需要两张贴纸“ba”和"abcd",因为使用这两张贴纸,
// 把每一个字符单独剪开,含有2个a、2个b、1个C。是可以拼出str的。所以返回2。public class StickersToSpellWord {//1.public static int minStickers1(String[] stickers,String target){int ans = process1(stickers,target);return ans==Integer.MAX_VALUE? -1:ans;}//每一种贴纸有无穷张//返回搞定target的最少张数public 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);//如果rest长度这个和原字符串一样,那么就是无效选择if(rest.length() != target.length()){min = Math.min(min,process1(stickers,rest));}}//判断min是不是无效选择min==Integer.MAX_VALUE? 0:1;//是的话就是Integer.MAX_VALUE+0 : 不是的话就是min + 1==>当前这张加上这张之后所有return min + (min==Integer.MAX_VALUE? 0:1);}public 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']--;}//程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过“+”符号来实现,// 但是这种方式达到目的的效率比较低,且每执行一次都会创建一个String对象,// 即耗时,又浪费空间。使用StringBuilder类(就可以避免这种问题的发生)//append(String str) / append(char c):字符串连接//builder.append((char)("14124").append("111").append("2222");StringBuilder builder = new StringBuilder();for(int i = 0;i<26;i++){if(count[i]>0){for(int j =0;j<count[i];j++){builder.append((char)(i+'a'));}}}return builder.toString();}//2.public static int minStickers2(String[] stickers,String target){int[][] counts = new int[stickers.length][26];for(int i=0;i<stickers.length;i++){char[] str = stickers[i].toCharArray();for(char cha:str) {counts[i][cha - 'a']++;}}int ans = process2(counts,target);return ans==Integer.MAX_VALUE? -1:ans;}//字符串不好确定参数可变范围,所以表依赖结构不好用也没必要用,当然也可以用,能做出了严格表依赖最好public static int process2(int[][] stickers,String t){if(t.length()==0){return 0;}//t的词频int[] count = new int[26];char[] target = t.toCharArray();for(char cha: target){count[cha-'a']++;}int N = stickers.length;int min = Integer.MAX_VALUE;for(int i=0;i<N;i++){//尝试第一张贴纸是谁int[] sticker = stickers[i];//判断包含剩余字符里面的第一个字符(随机位置的可以,最后一个,中间某一个)//最关键的优化(重要的剪枝!这一步也是贪心)if(sticker[target[0]-'a']>0){// == rest.length() != target.length()StringBuilder builder = new StringBuilder();for(int j=0;j<26;j++){if(count[j]>0){//看看有没有剩余int nums = count[j]-sticker[j];for(int k=0;k<nums;k++){builder.append((char)(j+'a'));}}}//转格式String rest = builder.toString();min = Math.min(min,process2(stickers,rest));}}return min+(min==Integer.MAX_VALUE?0:1);}//3.缓存表public static int minStickers3(String[] stickers,String target){int[][] counts = new int[stickers.length][26];for(int i=0;i<stickers.length;i++){char[] str = stickers[i].toCharArray();for(char cha:str) {counts[i][cha - 'a']++;}}HashMap<String,Integer> dp =new HashMap<>();dp.put("",0);int ans = process3(counts,target,dp);return ans==Integer.MAX_VALUE? -1:ans;}public static int process3(int[][] stickers,String t,HashMap<String,Integer> dp){//看看t这个字符串有没有计算过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;i<N;i++){int[] sticker = stickers[i];if(sticker[target[0]-'a']>0){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<nums;k++) {builder.append((char) (j + 'a'));}}}String rest = builder.toString();min = Math.min(min,process3(stickers,rest,dp));//保存rest这个字符串的最少贴纸dp.put(rest,min);}}return min+(min==Integer.MAX_VALUE?0:1);}public static void main(String[] args){String[] s={"ab","abd","abcd","sdfsd","p"};String target="babacsp";System.out.println(minStickers1(s,target));System.out.println(minStickers2(s,target));System.out.println(minStickers3(s,target));}
}

给定一个字符串str,给定一个字符串类型的数组arr,/出现的字符都是小写英文arr每一个字符串,/代表一张贴纸,你可以把单个字符剪开使用相关推荐

  1. 给定一个完全由小写英文字母组成的字符串等差递增序列

    给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, aab, aac, . ...

  2. join为什么每个字符都分割了 js_JS截取与分割字符串常用技巧总结

    本文实例讲述了JS截取与分割字符串的常用方法.分享给大家供大家参考,具体如下: JS截取字符串可使用 substring()或者slice() 函数:substring() 定义:substring( ...

  3. 输入一个大写英文字母,输出小写英文字母;输入一个小写英文字母输出一个大写英文字母

    题目:编写程序,从键盘输入一个英文字母.如果是大写字母,则输出它对应的小写字母:如果是小写字母,则输出它对应的大写字母. 题目来源c语言程序设计第二版电子科技大学出版社P90编程题t2 对于转换字母大 ...

  4. (小甲鱼字符串I编程)1.一个英文字符串,去掉相邻的大写小写如Aa,输出这个字符串 2.字符串按如下存放:它的偶数下标为小写英文字母奇数下标为正整数编写代码将奇数下标的数字转换为上一个字母偏移后的字母

    一.请按照以下规则整理一个给定的字符串 s. 一个整理好的字符串中,两个相邻字符 s[j] 和 s[j+1],其中 0 <= j <= s.length - 2,要满足如下条件: · 若 ...

  5. 猜字谜 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。 字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:

    今天是元宵节,力扣也细心地为我们准备了一道有关节日的题,一起看看吧: 1178. 猜字谜 外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧. 字谜的迷面 puzzle 按字符串形式给出 ...

  6. python不支持字符类型、单个字符也作为字符串使用_Python 字符串

    Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var ...

  7. python字符串str_python3 字符串str 教程

    var1 = 'Hello World!' var2 = "Python Programming" Python 访问子字符串,可以使用方括号来索引或截取(切片)获取子字符串,如下 ...

  8. python中将字符变为大写_Python实现将字符串的首字母变为大写,其余都变为小写的方法...

    Python实现将字符串的首字母变为大写,其余都变为小写的方法 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字. 思路:使用capitalize()函数将字符串的 ...

  9. java 字符全大写_怎么把字符串中的所有字母大小写?倒如NI hAo,大写变小写,小江写变大写,用java编程...

    展开全部 Java中将字母转换成大小写的方法toLowerCase() 转小写 toUpperCase() 转大写 如果需要把大小写互相转换,先把字符串62616964757a686964616fe5 ...

最新文章

  1. LINUX创建www的用户组和用户,并且不允许登录权限:
  2. 我放弃了年薪200万的岗位,因为“复制粘贴”的技术活让人厌恶
  3. super().__init__()理解(三)
  4. vue 版本发布 在线跟新用户操作解决方案_Vue3.0正式发布,本次发布所有总结,一起看看!【附在线视频】...
  5. Innodb中MySQL如何快速删除2T的大表
  6. MATLAB灰色预测
  7. 【NC14 按之字形顺序打印二叉树】
  8. Windows之node.js安装
  9. java笔试题_公司真题 | 用友2018秋招Java笔试题(四)
  10. Adapter中notify(),notifyAll(),notifyDataSetChanged(),notifyDataSetInvalidaded()方法的区别
  11. Android sdk下载安装配置教程
  12. 有这就够了小香港五味俱全——专升本高数
  13. 使用ESAPI 解决veracode 漏洞
  14. RFC1738 - 统一资源定位器URL
  15. 什么是VMWare虚拟机
  16. 标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
  17. C++程序设计基础之(第三章)函数
  18. JSON解析基础使用知识-Java
  19. 游戏一旦开始,结局就不是你能控制的!
  20. 第9节 蒙卡模拟计算美式期权价格(b)

热门文章

  1. 【艾特】淘宝7月新规上线,这类商家要注意避坑
  2. 产学研专家共议中国金融机构数字化转型,“守正创新”成主基调
  3. mysql cluster 宕机_MySQL InnDB Cluster 排错--dba.rejoinInstance()失败
  4. 利用正则来验证姓名、手机号、身份证号
  5. Mybatis的的批量修改操作
  6. 独家 | 利用深度学习和机器学习预测股票市场(附代码)
  7. “MOSE就是战略”系列之四:用MOSE支撑坍塌的IT战略
  8. JAVA程序实现电影源代码的世界创建
  9. 多表代替密码破解初探
  10. Redis源码学习(10),t_hash.c 学习(一),hset、hmset 命令学习