1. 题目

你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score。

请你帮忙计算玩家在单词拼写游戏中所能获得的「最高得分」:能够由 letters 里的字母拼写出的 任意 属于 words 单词子集中,分数最高的单词集合的得分。

单词拼写游戏的规则概述如下:

  • 玩家需要用字母表 letters 里的字母来拼写单词表 words 中的单词。
  • 可以只使用字母表 letters 中的部分字母,但是每个字母最多被使用一次。
  • 单词表 words 中每个单词只能计分(使用)一次。
  • 根据字母得分情况表score,字母 ‘a’, ‘b’, ‘c’, … , ‘z’ 对应的得分分别为 score[0], score[1], …, score[25]。
  • 本场游戏的「得分」是指:玩家所拼写出的单词集合里包含的所有字母的得分之和。
示例 1:
输入:words = ["dog","cat","dad","good"],
letters = ["a","a","c","d","d","d","g","o","o"],
score = [1,0,9,5,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0]
输出:23
解释:
字母得分为  a=1, c=9, d=5, g=3, o=2
使用给定的字母表 letters,我们可以拼写单词 "dad" (5+1+5)和 "good" (3+2+2+5),
得分为 23 。
而单词 "dad" 和 "dog" 只能得到 21 分。示例 2:
输入:words = ["xxxz","ax","bx","cx"],
letters = ["z","a","b","c","x","x","x"],
score = [4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,10]
输出:27
解释:
字母得分为  a=4, b=4, c=4, x=5, z=10
使用给定的字母表 letters,我们可以组成单词 "ax" (4+5), "bx" (4+5) 和 "cx" (4+5) ,
总得分为 27 。
单词 "xxxz" 的得分仅为 25 。示例 3:
输入:words = ["leetcode"],
letters = ["l","e","t","c","o","d"],
score = [0,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0]
输出:0
解释:
字母 "e" 在字母表 letters 中只出现了一次,所以无法组成单词表 words 中的单词。提示:
1 <= words.length <= 14
1 <= words[i].length <= 15
1 <= letters.length <= 100
letters[i].length == 1
score.length == 26
0 <= score[i] <= 10
words[i] 和 letters[i] 只包含小写的英文字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-score-words-formed-by-letters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 看数据量不是很大,直接回溯,枚举所有可能(每个单词取或者不取,214=16384)
class Solution {int maxscore = 0;
public:int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) {int n = words.size(), i;vector<int> count(26,0);for(i = 0; i < letters.size(); ++i)count[letters[i]-'a']++;//可使用的字母数量dfs(words, count, score, 0, 0);return maxscore;}void dfs(vector<string>& words, vector<int>& count, vector<int>& score, int i, int sc){if(i == words.size()){if(canAdd(count))//所选单词组合满足条件maxscore = max(maxscore, sc);return;}//加入该单词for(int j = 0; j < words[i].size(); ++j){  //更新单词得分,计数减少sc += score[words[i][j]-'a'];count[words[i][j]-'a']--;}dfs(words, count, score, i+1, sc);for(int j = 0; j < words[i].size(); ++j){ //回溯,计数重置,得分减去sc -= score[words[i][j]-'a'];count[words[i][j]-'a']++;}//不加入该单词dfs(words, count, score, i+1, sc);}bool canAdd(vector<int>& count){for(int i = 0; i < 26; ++i){if(count[i] < 0)return false;}return true;}
};

32 ms 8.7 MB

LeetCode 1255. 得分最高的单词集合(回溯)相关推荐

  1. 【1255. 得分最高的单词集合】

    来源:力扣(LeetCode) 描述: 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score. 请你帮忙计算玩家在单词拼写游戏中 ...

  2. LeetCode-1255. 得分最高的单词集合(DFS,组合/子集型枚举)

    1255. 得分最高的单词集合 [DFS回溯,二进制枚举] 分析: 这是一个组合/子集枚举问题 设单词表words的大小为n,那么所有可能的组合数为 2 n 2^n 2n 消耗的是字母表letter里 ...

  3. 得分最高的单词集合[二进制枚举]

    二进制枚举 前言 一.得分最高的单词集合 二.字符串组合 1.DFS 2.二进制枚举 总结 参考资料 前言 二进制枚举是把每个节点当作二进制的1bit,0表示未选择,1表示选择,就像是寻找子集一样,这 ...

  4. [枚举子集]leetcode1255:得分最高的单词集合(hard)

    题目: 题解: 思路:枚举子集 代码如下: class Solution {public:int maxScoreWords(vector<string>& words, vect ...

  5. LeetCode之单词搜索(回溯法求解)

    题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内 ...

  6. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  7. LeetCode—笔记—51、N皇后——递归回溯,个人思路,简单易懂

    LeetCode-笔记-51.N皇后--递归回溯,个人思路,简单易懂 51. N 皇后 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 ...

  8. LeetCode算法题127:单词接龙解析

    给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 1.每次转换只能改变一个字母. 2.转换过 ...

  9. leetcode 79. Word Search | 79. 单词搜索(回溯+DFS)

    题目 https://leetcode.com/problems/word-search/ 题解 回溯 + DFS,回溯是有后效性的,所以不能转化为 DP class Solution {int M; ...

最新文章

  1. Python中is和==的区别
  2. 可变参数表 C语言 多态,C语言可变长参数实现“多态”.pdf
  3. jdeps_JDeps入门–分析项目的依赖关系
  4. 管理服务器文件绿色版本,Services.msc服务器文件官方版
  5. 查看占用指定端口的程序
  6. 鸿蒙轻内核定时器Swtmr:不受硬件和数量限制,满足用户需求
  7. 一图看懂cortex-M0/M3矢量表,记住LSB置1表示Thumb
  8. 使用 Sharding-Jdbc 实现分库分表、读写分离(未完待续)
  9. php中的try语句,PHP Try-catch 语句使用技巧
  10. Myeclipse2014在线安装SVN插件
  11. 你不了解的事,十三天精通爬虫分布式学习路线,赠教程
  12. 【LDO稳压器】SOT23-5封装-RT9193-RT9013-LP2992-LP5907设计
  13. VS C++控制台程序 错误 fatal error C1083: 无法打开包括文件 解决办法
  14. Seaborn实战案例 | 绘制分类条形统计图
  15. JAVA中(PO,VO,TO,BO,DAO,POJO)分别是指什么
  16. 微信-H5界面跳转至公众号关注界面问题
  17. 临床医疗运营数据分析
  18. 用for循环解决鸡兔同笼问题:上有三十五头,下有九十四足,问雉兔各几何?
  19. sizeof(int)为什么输出的是4而不是2呢,int类型究竟占几个字节
  20. mysql error unpacking_linux 安装 mysql rpm包出现error: unpacking of archive failed on file

热门文章

  1. python金字塔_高斯金字塔与拉普拉斯金字塔的原理与python构建
  2. java游戏运行环境_Java运行环境
  3. Kettle 学习导航帖整理
  4. uC/OS-II源码分析(二)
  5. 将一个java工程导入到myeclipse应该注意的地方
  6. cf 621E. Wet Shark and Blocks
  7. Everyday is an Opportunity
  8. [AngularJS]Chapter 1 AnjularJS简介
  9. 别人叫我程序猿,我称自己攻城狮。没日没夜写代码,不知何日涨工资?
  10. Oracl数据库中大数据的备份-2