/*
题目二
给定一个字符串str,给定一个字符串类型的数组arr
arr里的每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来
每一种贴纸都可以使用任意张,重复的算2张,每一张贴纸都可以剪的非常的碎
返回需要至少多少张贴纸可以完成这个任务
例子: str = "babac", arr = {"ba","c","abcd"}
至少需要两张贴纸"ba"和 “abcd”, 因为使用这两张贴纸,把每一个字符单独剪开,含有2个a、2个b、1个c
是拼出str的,所以返回2可以先排序
*//*
"baabk"
"aaccc"
"dfffd"[2200...1]       // n个26长度数组0123...'k'-'a'abcd   k*///leetcode https://leetcode-cn.com/problems/stickers-to-spell-word/
func minStickers1(stickers []string, target string) int { //target 剩余的字符串n := len(stickers)mp := make([][]int,n)  // 代表所有贴纸for k := range mp {mp[k] = make([]int,26)}dp := map[string]int{}   //傻缓存for i := 0; i < n; i++ {for _, char := range stickers[i] {  // 生成每一张的贴纸的词频统计mp[i][char-'a']++}}dp[""] = 0return processMinStickers1(&dp,mp,target)
}
// 若返回值是-1,表示mp中的贴纸怎么都无法搞定剩余的rest字符串的
func processMinStickers1(dp *map[string]int,mp [][]int,rest string) int {if _,ok := (*dp)[rest]; ok {return (*dp)[rest]}//一下就是正式的递归调用过程ans := math.MaxInt        // 搞定rest 使用最少的贴纸数量n :=  len(mp)             // n种贴纸tmap := make([]int,26)    // rest 转换成词频类型 tmp 替代restfor _, char := range rest {  // 用魔法去对抗魔法tmap[char-'a']++}for i := 0; i < n ; i++ {if mp[i][rest[0]-'a'] == 0 { // "aaaabbbbbcccc" 字符串,剩余字符串是"xyz"的话就跑不完了,小贪心continue                 // 贴纸中必须包含target字符中的一个}/*不加上边这句会栈溢出runtime: goroutine stack exceeds 1000000000-byte limitruntime: sp=0xc020181388 stack=[0xc020180000, 0xc040180000]fatal error: stack overflow*/sb := bytes.Buffer{}// i 贴纸, j 枚举a~z 字符for j := 0; j < 26; j++ {if tmap[j] > 0 {for k := 0; k < Max(0, tmap[j]-mp[i][j]); k++ {sb.WriteByte(byte('a'+j))}}}s := sb.String() // 剩下的字符,减法操作tmp := processMinStickers1(dp,mp,s)if tmp != -1 {ans = Min(ans,1 + tmp)}}if ans == math.MaxInt {(*dp)[rest] = -1}else {(*dp)[rest] = ans}return (*dp)[rest]
}
// 可能性太多了,无法改成精细化结构的动态规划,虽然有重复解/*
方法二,略
"aaaabbbccc"
"aa"
"bb"
"cc"
每一轮枚举每一张贴纸的张数设计递归的原则:可变参数尽量的少,以此换取缓存的命中率*/func TestMinStickers1(t *testing.T)  {arr := []string{"aaaa","bbaa","ccddd"}str := "abcccccdddddbbbaaaaa"t.Log(minStickers1(arr,str))t.Logf("%x",math.MaxInt)
}

动态规划——贴纸拼词相关推荐

  1. 【LeetCode】 贴纸拼词(动态规划)

    691. 贴纸拼词 - 力扣(LeetCode) 一.题目 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重 ...

  2. 贴纸拼词--动态规划

    贴纸拼词 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们.如果你愿意,你可以多次使用每个贴纸,每 ...

  3. Leetcode 691. 贴纸拼词 C++

    Leetcode 691. 贴纸拼词 题目 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 tar ...

  4. java编程贴纸问题_Java实现 LeetCode 691 贴纸拼词(DFS+map记录)

    691. 贴纸拼词 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话 ...

  5. 暴力递归到动态规划 05 (贴纸拼词)

    题目链接 1. 暴力递归(超时) public int minStickers(String[] stickers, String target) {int result = minSticker(s ...

  6. 【力扣每日一题】691. 贴纸拼词

    题目描述 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们.如果你愿意,你可以多次使用每个贴纸,每 ...

  7. 【完全背包】A005_LC_贴纸拼词(dp + 状态压缩)

    我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话,你可以不止一次地使 ...

  8. php三年级英语,三年级英语拼词大赛

    词汇是语言的基本材料,是语言的三要素之一.离开词汇就无法正常地交流.词汇不丰富,也必然会影响思想交流.学生掌握的词汇越多,他们运用语言的能力就越强. 因此,为激发学生学习英语的兴趣,丰富词汇量,提高三 ...

  9. 动态规划解决贴纸拼字游戏

    文章目录 题目描述 分析 题目描述 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. ...

最新文章

  1. linux nas解决方案_阿里产品总监:四大 Linux 支持的 NAS 解决方案
  2. python训练词库_在Python中训练NGramModel
  3. Bloomfilter 的应用场景
  4. 详细介绍MySQL/MariaDB的锁
  5. java adapter 模式_Java设计模式之适配器模式(Adapter模式)介绍
  6. JavaScript iterator 设计模式
  7. Editor扩展之查看Prefab用在那儿
  8. 根据导出的查询结果拼接字符串,生成sql语句并保存到txt文件中
  9. Flutter游戏:简单规则与结束页
  10. struts2要点总结
  11. 吴锦华/明鑫: 用户态文件系统(FUSE)框架分析和实战
  12. hprose for php,基于swoole的Hprose for PHP 开发后端API服务 实践
  13. javascript 构造函数方式定义对象 (转载)
  14. 计算机控制人脑的电影,推荐20部全球经典烧脑电影,考验你智商的时刻到了(上)...
  15. 手机浏览器onclick事件不能跳转页面
  16. python爬取文章_[Python]爬取微信公众号文章
  17. 联通沃云联手阿里云推混合云解决方案 打造共赢云生态
  18. 华硕电脑黑屏 怎么按都开不了机解决方法
  19. mail = imaplib.IMAP4_SSL('k20gslf-0kF')
  20. 本特利传感器330901-00-90-10-02-CN

热门文章

  1. 用树莓派控制两盏灯(二)
  2. pg数据库 设置不区分大小写_浅谈PostgreSQL中大小写不敏感问题
  3. UE_LOG打印信息
  4. 明年9月,南京大学苏州校区将正式招生!
  5. 聚焦“芯”产业,搭建“芯”桥梁——清微智能出席AIIA2020年度AI芯片交流会
  6. 利用Cam对Hopenet网络模型进行可视化
  7. win10如何共享整个D盘
  8. Java 报错Attempted read from closed stream
  9. html5 lineheight属性,深入理解line-height属性
  10. 小福利,用selenium模块爬取qq音乐歌单!