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++相关推荐

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

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

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

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

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

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

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

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

  5. 动态规划——贴纸拼词

    /* 题目二 给定一个字符串str,给定一个字符串类型的数组arr arr里的每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来 每一种贴纸都可以使用任意张,重复的算2张,每一张 ...

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

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

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

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

  8. leetCode最短补全词

    leetCode最短补全词 题目要求如下: 给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 . 补全词 是一个包含 licens ...

  9. leetcode之字母异位词分组

    题目描述: 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次. 示例 1: 输 ...

最新文章

  1. PyTorch 源码解读之分布式训练了解一下?
  2. object-c中的继承
  3. MBZUAI大学招生了,Michael Jordan、Raj Reddy等大佬授课
  4. 新浪微博开放平台API中page参数的使用方法
  5. 【Java】练习题:数字判断
  6. micropython esp8266教程_ESP8266 快速开发指南
  7. Java:IDEA下使用JUNIT
  8. 28 SD配置-主数据-信用管理-定义信贷组
  9. javascript判断是否手机设备+滑动事件
  10. idea错误提示不明显_微信公众号扫一扫功能提示:10003 redirect_uri域名与后台配置不一致错误解决方案...
  11. 2020各大网站rss订阅源地址_2020-20-18——DJANGO复习
  12. 解决SQL server不支持utf8,php却用utf8的矛盾问题
  13. RS编码-Python工具包使用
  14. 计算机打印机能不能取消正在,打印机怎么取消正在排队打印的任务? 打印机删除打印任务的教程...
  15. 有一种英语口音,不仅一般人儿听不懂,连各种语音识别都全军覆没…(新版)...
  16. 拒绝精神内耗,5个适合中年人的自学网站,让你脱胎换骨
  17. qq音乐 (轮播图) 详细介绍
  18. so文件的编译与使用
  19. Windows安裝SourceTree
  20. 2016年8月23日 星期二 --出埃及记 Exodus 16:24

热门文章

  1. VS2017 C# Winform程序和DLL打包!超详细图解
  2. 【抓包】网易云音乐WEB端歌曲评论接口分析
  3. 一首美国人写、唱的俄罗斯风格的歌曲
  4. Eclipse常用快捷键和字体设置
  5. Poi模板导出(设置字体样式)
  6. Rust Wasm 图片转 ASCII 艺术
  7. S7-200SMART与MCGS触摸屏进行RS485通信的具体方法示例
  8. 如何将Excel表格进行美化?学会这几招你的表格更加美观养眼
  9. android7.1.1彩蛋魅族,魅族Flyme Android 10首个内测版本已推送 强制开启90Hz彩蛋
  10. Python selenium自动化测试框架入门--登录测试实例