[LeetCode] Shortest Completing Word 最短完整的单词
Find the minimum length word from a given dictionary words, which has all the letters from the string licensePlate. Such a word is said to complete the given string licensePlate
Here, for letters we ignore case. For example, "P" on the licensePlate still matches "p" on the word.
It is guaranteed an answer exists. If there are multiple answers, return the one that occurs first in the array.
The license plate might have the same letter occurring multiple times. For example, given a licensePlate of "PP", the word "pair" does not complete the licensePlate, but the word "supper" does.
Example 1:
Input: licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"]
Output: "steps"
Explanation: The smallest length word that contains the letters "S", "P", "S", and "T".
Note that the answer is not "step", because the letter "s" must occur in the word twice.
Also note that we ignored case for the purposes of comparing whether a letter exists in the word.
Example 2:
Input: licensePlate = "1s3 456", words = ["looks", "pest", "stew", "show"]
Output: "pest"
Explanation: There are 3 smallest length words that contains the letters "s".
We return the one that occurred first.
Note:
licensePlatewill be a string with length in range[1, 7].licensePlatewill contain digits, spaces, or letters (uppercase or lowercase).wordswill have a length in the range[10, 1000].- Every
words[i]will consist of lowercase letters, and have length in range[1, 15].
这道题给了我们一个车牌号,还有一些单词,让我们找出包含这个车牌号中所有字母的第一个最短的单词。车牌中的字母有大小写之分,但是单词只是由小写单词组成的,所以需要把车牌号中的所有大写字母都转为小写的,转换方法很简单,ASCII码加上32即可。我们建立车牌中各个字母和其出现的次数之间的映射,同时记录所有字母的个数total,然后遍历所有的单词,对于每个单词都要单独处理,我们遍历单词中所有的字母,如果其在车牌中也出现了,则对应字母的映射减1,同时还需匹配的字母数cnt也自减1,最后遍历字母完成后,如果cnt为0(说明车牌中所有的字母都在单词中出现了),并且结果res为空或长度大于当前单词word的话,更新结果即可,参见代码如下:
解法一:
class Solution {
public:
string shortestCompletingWord(string licensePlate, vector<string>& words) {
string res = "";
int total = ;
unordered_map<char, int> freq;
for (char c : licensePlate) {
if (c >= 'a' && c <= 'z') {++freq[c]; ++total;}
else if (c >= 'A' && c <= 'Z') {++freq[c + ]; ++total;}
}
for (string word : words) {
int cnt = total;
unordered_map<char, int> t = freq;
for (char c : word) {
if (--t[c] >= ) --cnt;
}
if (cnt == && (res.empty() || res.size() > word.size())) {
res = word;
}
}
return res;
}
};
如果这道题的单词是按长度排序的话,那么上面的方法就不是很高效了,因为其会强制遍历完所有的单词。所以我们考虑给单词排序,博主这里用了TreeMap这个数据结构建立单词长度和包含所有该长度单词的数组之间的映射,其会自动按照单词长度来排序。然后还使用了一个chars数组来记录车牌中的所有字母,这样就可以方便的统计出字母总个数。我们从单词长度等于字母总个数的映射开始遍历,先检验该长度的所有单词。这里检验方法跟上面略有不同,但都大同小异,用一个bool型变量succ,初始化为true,然后建立一个字母和其出现次数的映射,先遍历单词,统计各个字母出现的次数。然后就遍历chars数组,如果chars中某个字母不在单词中,那么succ赋值为false,然后break掉。最后我们看succ,如果仍为true,直接返回当前单词word,之后的单词就不用再检验了,参见代码如下:
解法二:
class Solution {
public:
string shortestCompletingWord(string licensePlate, vector<string>& words) {
map<int, vector<string>> m;
vector<char> chars;
for (string word : words) {
m[word.size()].push_back(word);
}
for (char c : licensePlate) {
if (c >= 'a' && c <= 'z') chars.push_back(c);
else if (c >= 'A' && c <= 'Z') chars.push_back(c + );
}
for (auto a : m) {
if (a.first < chars.size()) continue;
for (string word : a.second) {
bool succ = true;
unordered_map<char, int> freq;
for (char c : word) ++freq[c];
for (char c : chars) {
if (--freq[c] < ) {succ = false; break;}
}
if (succ) return word;
}
}
return "";
}
};
参考资料:
https://discuss.leetcode.com/topic/114155/java-c-clean-code
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Shortest Completing Word 最短完整的单词的更多相关文章
- 【Leetcode_easy】748. Shortest Completing Word
problem 748. Shortest Completing Word 题意: solution1: class Solution { public: string shortestComplet ...
- [Swift]LeetCode748. 最短完整词 | Shortest Completing Word
Find the minimum length word from a given dictionary words, which has all the letters from the strin ...
- 【LeetCode】748. Shortest Completing Word 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode算法题-Shortest Completing Word(Java实现)
这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...
- LeetCode 748 Shortest Completing Word 解题报告
题目要求 Find the minimum length word from a given dictionary words, which has all the letters from the ...
- [LeetCode&Python] Problem 748. Shortest Completing Word
Find the minimum length word from a given dictionary words, which has all the letters from the strin ...
- leetcode 748. Shortest Completing Word
Find the minimum length word from a given dictionary words, which has all the letters from the strin ...
- [LeetCode] Most Common Word 最常见的单词
Given a paragraph and a list of banned words, return the most frequent word that is not in the list ...
- [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写
An abbreviation of a word follows the form <first letter><number><last letter>. Be ...
随机推荐
- 爬虫(requests)
requests库包含两个对象:Response和Requests Response对象属性: r.status_code HTTP请求的返回状态,200表示成功 r.text ...
- Jmeter中正则表达式提取器使用详解
在使用Jmeter过程中,会经常使用到正则表达式提取器提取器,虽然并不直接涉及到请求的测试,但是对于数据的传递起着很大的作用,本篇博文就是主要讲解关于正则表达式及其在Jmeter的Sampler中的调 ...
- echarts对每个data[i]的图片添加点击事件
1.综述:以饼图为例,只需要对echarts对象option添加以下几行代码即可 //添加点击事件(单击),还有其他鼠标事件和键盘事件等等 myChart1.on("click", ...
- Hibernate学习错误集锦-GenericJDBCException: could not execute statement
初次使用Hibernate,进行junit测试,报如下错误. 原因:Hibernate帮我们管理主键了,我们不需要对主键赋值,并且主键是自增的.所以在数据库中,逐渐选项应当勾选 org.hiberna ...
- 201421123042 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...
- java 二维码解析和生成
package ykxw.web.qrcode.utils; import java.awt.Color; import java.awt.Graphics2D; import java.awt.im ...
- bzoj 4399 魔法少女LJJ
4399: 魔法少女LJJ Time Limit: 20 Sec Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?i ...
- Node入门教程(1)目录
aicoder.com 全栈实习之简明 Node 入门文档 aicoder.com 线下实习: 不 8000 就业,不还实习费. 如果需要转载本文档,请联系老马,Q: 515154084 JS基础教程 ...
- sql 多条记录插入
--多条记录插入,用逗号分开值. INSERT dbo.studentinfor ( id, name, class, age, hpsw ) ', -- id - nvarchar(50) N'te ...
- dede观看总结自己总结
知识点一:{dede:arclist channelid="18" addfields="language,pfz" limit="0,5" ...