Leetcode 691. 贴纸拼词 C++
Leetcode 691. 贴纸拼词
题目
我们给出了 N 种不同类型的贴纸。每个贴纸上都有一个小写的英文单词。
你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target。
如果你愿意的话,你可以不止一次地使用每一张贴纸,而且每一张贴纸的数量都是无限的。
拼出目标 target 所需的最小贴纸数量是多少?如果任务不可能,则返回 -1。
测试样例
示例 1:
输入:["with", "example", "science"], "thehat"
输出:3
解释:我们可以使用 2 个 "with" 贴纸,和 1 个 "example" 贴纸。
把贴纸上的字母剪下来并重新排列后,就可以形成目标 “thehat“ 了。
此外,这是形成目标字符串所需的最小贴纸数量。
示例 2:
输入:["notice", "possible"], "basicbasic"
输出:-1
解释:我们不能通过剪切给定贴纸的字母来形成目标“basicbasic”。
提示:
- stickers 长度范围是 [1, 50]。
- stickers 由小写英文单词组成(不带撇号)。
- target 的长度在 [1, 15]范围内,由小写字母组成。
- 在所有的测试案例中,所有的单词都是从 1000 个最常见的美国英语单词中随机选取的,目标是两个随机单词的串联。
- 时间限制可能比平时更具挑战性。预计 50 个贴纸的测试案例平均可在35ms内解决。
题解
状态压缩+动态规划
令dp[state]表示完成state状态的字母拼写需要的最小贴纸数,其中state是具有target.length位的数,若第i位(低位)为1,则表明target[i]完成拼写。
我们便利每个状态,对于每个状态,我们选取贴纸对其进行改变,我们需要将这个贴纸的单词尽可能的用于target上。因此,如果changeState & (1<<j),其中changeState是当前的一个状态,j表明target[j]。
转移方程的具有解释见代码
代码
int minStickers(vector<string>& stickers, string target) {int n = stickers.size(), len = target.length();vector<vector<int>> time(n,vector<int>(26,0));for(int i=0; i<n; i++){ //统计每个单词能使用的字母数for(int j=0; j<stickers[i].length(); j++)time[i][stickers[i][j]-'a']++;}vector<int> dp(1<<len,-1);dp[0] = 0;for(int state=0; state<(1<<len); state++){ //遍历每个状态,对该状态进行改变if(dp[state]==-1) continue; //当前状态不能实现for(int i=0; i<n; i++){ //选取第i个贴纸,需要尽可能的使用其中的字母int changeState = state;vector<int> now = time[i]; //记录可以使用的字母for(int j=0; j<len; j++){ //判断target[j]是否已贴上,未贴上则判断当前贴纸是否可能完成该字母if(changeState & (1<<j)) continue; //该位置已经贴上了else if(now[target[len-j-1]-'a'] != 0){ //可以用来贴当前字母changeState |= (1<<j); //更新状态now[target[len-j-1]-'a']--; //减少可用字母数}}if(dp[changeState]==-1 || dp[changeState]>dp[state]+1) //当前完成changeState状态所用贴纸数最少dp[changeState] = dp[state]+1;}}return dp[(1<<len)-1];}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/stickers-to-spell-word
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Leetcode 691. 贴纸拼词 C++相关推荐
- java编程贴纸问题_Java实现 LeetCode 691 贴纸拼词(DFS+map记录)
691. 贴纸拼词 我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话 ...
- 【LeetCode】 贴纸拼词(动态规划)
691. 贴纸拼词 - 力扣(LeetCode) 一.题目 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重 ...
- 【力扣每日一题】691. 贴纸拼词
题目描述 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们.如果你愿意,你可以多次使用每个贴纸,每 ...
- 贴纸拼词--动态规划
贴纸拼词 我们有 n 种不同的贴纸.每个贴纸上都有一个小写的英文单词. 您想要拼写出给定的字符串 target ,方法是从收集的贴纸中切割单个字母并重新排列它们.如果你愿意,你可以多次使用每个贴纸,每 ...
- 动态规划——贴纸拼词
/* 题目二 给定一个字符串str,给定一个字符串类型的数组arr arr里的每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来 每一种贴纸都可以使用任意张,重复的算2张,每一张 ...
- 【完全背包】A005_LC_贴纸拼词(dp + 状态压缩)
我们给出了 N 种不同类型的贴纸.每个贴纸上都有一个小写的英文单词. 你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target. 如果你愿意的话,你可以不止一次地使 ...
- 暴力递归到动态规划 05 (贴纸拼词)
题目链接 1. 暴力递归(超时) public int minStickers(String[] stickers, String target) {int result = minSticker(s ...
- leetCode最短补全词
leetCode最短补全词 题目要求如下: 给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 . 补全词 是一个包含 licens ...
- leetcode之字母异位词分组
题目描述: 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次. 示例 1: 输 ...
最新文章
- PyTorch 源码解读之分布式训练了解一下?
- object-c中的继承
- MBZUAI大学招生了,Michael Jordan、Raj Reddy等大佬授课
- 新浪微博开放平台API中page参数的使用方法
- 【Java】练习题:数字判断
- micropython esp8266教程_ESP8266 快速开发指南
- Java:IDEA下使用JUNIT
- 28 SD配置-主数据-信用管理-定义信贷组
- javascript判断是否手机设备+滑动事件
- idea错误提示不明显_微信公众号扫一扫功能提示:10003 redirect_uri域名与后台配置不一致错误解决方案...
- 2020各大网站rss订阅源地址_2020-20-18——DJANGO复习
- 解决SQL server不支持utf8,php却用utf8的矛盾问题
- RS编码-Python工具包使用
- 计算机打印机能不能取消正在,打印机怎么取消正在排队打印的任务? 打印机删除打印任务的教程...
- 有一种英语口音,不仅一般人儿听不懂,连各种语音识别都全军覆没…(新版)...
- 拒绝精神内耗,5个适合中年人的自学网站,让你脱胎换骨
- qq音乐 (轮播图) 详细介绍
- so文件的编译与使用
- Windows安裝SourceTree
- 2016年8月23日 星期二 --出埃及记 Exodus 16:24
热门文章
- VS2017 C# Winform程序和DLL打包!超详细图解
- 【抓包】网易云音乐WEB端歌曲评论接口分析
- 一首美国人写、唱的俄罗斯风格的歌曲
- Eclipse常用快捷键和字体设置
- Poi模板导出(设置字体样式)
- Rust Wasm 图片转 ASCII 艺术
- S7-200SMART与MCGS触摸屏进行RS485通信的具体方法示例
- 如何将Excel表格进行美化?学会这几招你的表格更加美观养眼
- android7.1.1彩蛋魅族,魅族Flyme Android 10首个内测版本已推送 强制开启90Hz彩蛋
- Python selenium自动化测试框架入门--登录测试实例