动态规划——贴纸拼词
/*
题目二
给定一个字符串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)
}
动态规划——贴纸拼词相关推荐
- 【LeetCode】 贴纸拼词(动态规划)
691. 贴纸拼词 - 力扣(LeetCode) 一.题目 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重 ...
- 贴纸拼词--动态规划
贴纸拼词 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们.如果你愿意,你可以多次使用每个贴纸,每 ...
- Leetcode 691. 贴纸拼词 C++
Leetcode 691. 贴纸拼词 题目 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 tar ...
- java编程贴纸问题_Java实现 LeetCode 691 贴纸拼词(DFS+map记录)
691. 贴纸拼词 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话 ...
- 暴力递归到动态规划 05 (贴纸拼词)
题目链接 1. 暴力递归(超时) public int minStickers(String[] stickers, String target) {int result = minSticker(s ...
- 【力扣每日一题】691. 贴纸拼词
题目描述 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们.如果你愿意,你可以多次使用每个贴纸,每 ...
- 【完全背包】A005_LC_贴纸拼词(dp + 状态压缩)
我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话,你可以不止一次地使 ...
- php三年级英语,三年级英语拼词大赛
词汇是语言的基本材料,是语言的三要素之一.离开词汇就无法正常地交流.词汇不丰富,也必然会影响思想交流.学生掌握的词汇越多,他们运用语言的能力就越强. 因此,为激发学生学习英语的兴趣,丰富词汇量,提高三 ...
- 动态规划解决贴纸拼字游戏
文章目录 题目描述 分析 题目描述 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. ...
最新文章
- linux nas解决方案_阿里产品总监:四大 Linux 支持的 NAS 解决方案
- python训练词库_在Python中训练NGramModel
- Bloomfilter 的应用场景
- 详细介绍MySQL/MariaDB的锁
- java adapter 模式_Java设计模式之适配器模式(Adapter模式)介绍
- JavaScript iterator 设计模式
- Editor扩展之查看Prefab用在那儿
- 根据导出的查询结果拼接字符串,生成sql语句并保存到txt文件中
- Flutter游戏:简单规则与结束页
- struts2要点总结
- 吴锦华/明鑫: 用户态文件系统(FUSE)框架分析和实战
- hprose for php,基于swoole的Hprose for PHP 开发后端API服务 实践
- javascript 构造函数方式定义对象 (转载)
- 计算机控制人脑的电影,推荐20部全球经典烧脑电影,考验你智商的时刻到了(上)...
- 手机浏览器onclick事件不能跳转页面
- python爬取文章_[Python]爬取微信公众号文章
- 联通沃云联手阿里云推混合云解决方案 打造共赢云生态
- 华硕电脑黑屏 怎么按都开不了机解决方法
- mail = imaplib.IMAP4_SSL('k20gslf-0kF')
- 本特利传感器330901-00-90-10-02-CN
热门文章
- 用树莓派控制两盏灯(二)
- pg数据库 设置不区分大小写_浅谈PostgreSQL中大小写不敏感问题
- UE_LOG打印信息
- 明年9月,南京大学苏州校区将正式招生!
- 聚焦“芯”产业,搭建“芯”桥梁——清微智能出席AIIA2020年度AI芯片交流会
- 利用Cam对Hopenet网络模型进行可视化
- win10如何共享整个D盘
- Java 报错Attempted read from closed stream
- html5 lineheight属性,深入理解line-height属性
- 小福利,用selenium模块爬取qq音乐歌单!