[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 ... 
随机推荐
- Jmeter 前置处理器 BeanShell_PreProcessor 适用思考
			首先摘抄一段官方文档的话: Before invoking the script, some variables are set up in the BeanShell interpreter: lo ... 
- 去除input的自动填充色
			input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px #ffffff inset !important; } 
- Java基础学习(二)
			软件设计原则: 为了提高软件的开发效率,降低软件开发成本,一个优良的软件系统应该具有以下特点: 1,可重用性:遵循DRY原则,减少软件中的重复代码. 2,可拓展性:当软件需要升级增加新的功能,能够在现 ... 
- Alpha冲刺No.7
			一.站立式会议 彻底完成初步的界面设计 实现界面的简单跳转 完成部分事件监听 移植摄像头.图库功能到真实手机环境测试 数据库上传获取日记 二.项目实际进展 完成了简单的界面设计 大致完成了跳转任务 数 ... 
- Beta阶段敏捷冲刺报告-DAY3
			Beta阶段敏捷冲刺报告-DAY3 Scrum Meeting 敏捷开发日期 2017.11.4 会议时间 12:30 会议地点 软工所 参会人员 全体成员 会议内容 当天任务确认,进度调整, 讨论时 ... 
- Linux下Java通用安装方法
			1.到oracle官网下下载对应jdk包,一般为%x64%.tar.gz格式. 2.建立目录: $ mkdir /usr/local/java 3.将压缩包解压至/usr/local/java 4.修 ... 
- 项目Beta冲刺Day3
			项目进展 李明皇 今天解决的进度 完善了程序的运行逻辑(消息提示框等) 明天安排 前后端联动调试 林翔 今天解决的进度 向微信官方申请登录验证session以维护登录态 明天安排 继续完成维护登录态 ... 
- 第二篇:利用shell脚本执行webservice请求——基于soap
			1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ... 
- 如何在Java中避免equals方法的隐藏陷阱
			摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ... 
- 阿里云API网关(15)监控预警
			网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ... 
