[LeetCode] Unique Word Abbreviation 独特的单词缩写
An abbreviation of a word follows the form <first letter><number><last letter>. Below are some examples of word abbreviations:
a) it --> it (no abbreviation)
1
b) d|o|g --> d1g
1 1 1
1---5----0----5--8
c) i|nternationalizatio|n --> i18n
1
1---5----0
d) l|ocalizatio|n --> l10n
Assume you have a dictionary and given a word, find whether its abbreviation is unique in the dictionary. A word's abbreviation is unique if no other word from the dictionary has the same abbreviation.
Example:
Given dictionary = [ "deer", "door", "cake", "card" ]
isUnique("dear") -> false
isUnique("cart") -> true
isUnique("cane") -> false
isUnique("make") -> true
这道题让我们求独特的单词缩写,但是题目中给的例子不是很清晰,来看下面三种情况:
1. dictionary = {"dear"}, isUnique("door") -> false
2. dictionary = {"door", "door"}, isUnique("door") -> true
3. dictionary = {"dear", "door"}, isUnique("door") -> false
从上面三个例子可以看出,当缩写一致的时候,字典中的单词均和给定单词相同时,返回 true。这里需要用 HashMap 来建立缩写形式和其对应的单词的映射,把所有缩写形式的相同单词放到一个 HashSet 中,然后再判断是否 unique 的时候只需要看给定单词的缩写形式的 HashSet 里面该单词的个数是否和 HashSet 中的元素总数相同,相同的话就是上面的第二种情况,返回 true。需要注意的是由于 HashSet 中不能有重复值,所有上面第二种情况只会有一个 door 存在 HashSet 里,但是并不影响判断结果,参见代码如下:
解法一:
class ValidWordAbbr {
public:
ValidWordAbbr(vector<string>& dictionary) {
for (auto a : dictionary) {
string k = a;
if (a.size() > ) k = a[] + to_string(a.size() - ) + a.back();
m[k].insert(a);
}
}
bool isUnique(string word) {
string k = word;
if (word.size() > ) k = word[] + to_string(word.size() - ) + word.back();
return m[k].count(word) == m[k].size();
}
private:
unordered_map<string, unordered_set<string>> m;
};
如果我们想省一些空间,也可以不用 HashSet,但如何区分上面的第二和第三种情况呢,在遇到 HashMap 中没有当前缩写形式的时候,将该缩写形式和当前单词建立映射,如果该缩写形式应经存在,那么看如果映射的单词不是当前单词,将映射单词改为空字符串,这样做的原因是,在对于第三种情况 dictionary = {"dear", "door"} 时,遍历 dear 时,建立 d2r 和 dear 的映射,当遍历到 door 的时候,由于 door 和 dear 不同,将映射改为 d2r 和 "" 映射,而对于第二种情况 dictionary = {"door", "door"},保留 d2r 和 door 的映射,那么这样在判断 door 是否 unique 时,就可以区别第二种和第三种情况了,参见代码如下:
解法二:
class ValidWordAbbr {
public:
ValidWordAbbr(vector<string>& dictionary) {
for (auto a : dictionary) {
string k = a;
if (a.size() > ) k = a[] + to_string(a.size() - ) + a.back();
if (m.find(k) != m.end() && m[k] != a) m[k] = "";
else m[k] = a;
}
}
bool isUnique(string word) {
string k = word;
if (word.size() > ) k = word[] + to_string(word.size() - ) + word.back();
return m.find(k) == m.end() || m[k] == word;
}
private:
unordered_map<string, string> m;
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/288
类似题目:
Two Sum III - Data structure design
参考资料:
https://leetcode.com/problems/unique-word-abbreviation/
https://leetcode.com/problems/unique-word-abbreviation/discuss/73133/8-lines-in-C%2B%2B...
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Unique Word Abbreviation 独特的单词缩写的更多相关文章
- [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写
An abbreviation of a word follows the form <first letter><number><last letter>. Be ...
- 408. Valid Word Abbreviation有效的单词缩写
[抄题]: Given a non-empty string s and an abbreviation abbr, return whether the string matches with th ...
- Leetcode Unique Word Abbreviation
An abbreviation of a word follows the form <first letter><number><last letter>. Be ...
- [LeetCode] Minimum Unique Word Abbreviation 最短的独一无二的单词缩写
A string such as "word" contains the following abbreviations: ["word", "1or ...
- [LeetCode] Valid Word Abbreviation 验证单词缩写
Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...
- [LeetCode] 527. Word Abbreviation 单词缩写
Given an array of n distinct non-empty strings, you need to generate minimal possible abbreviations ...
- [Locked] Unique Word Abbreviation
Unique Word Abbreviation An abbreviation of a word follows the form <first letter><number&g ...
- [Swift]LeetCode288. 唯一单词缩写 $ Unique Word Abbreviation
An abbreviation of a word follows the form <first letter><number><last letter>. Be ...
- 288. Unique Word Abbreviation
题目: An abbreviation of a word follows the form <first letter><number><last letter> ...
随机推荐
- Oracle 11.2.0.4单实例打PSU,OJVM PSU补丁快速参考
写在前面: 1.Oracel打每个补丁的操作有时存在差异,所以不管多熟悉,都应该在打任何补丁之前阅读新补丁中附带的readme. 2.Oracle每季度都会更新一个最新的PSU,本文最新指的是当前最新 ...
- Oracle 11g RAC 应用补丁简明版
之前总结过<Oracle 11.2.0.4 RAC安装最新PSU补丁>, 这次整理为简明版,忽略一切输出的显示,引入一些官方的说明,增加OJVM PSU的补丁应用. 环境:RHEL6.5 ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- redis命令1
SADD numbers 1 3 5 创建一个名为numbers的intset SADD fruites "apple" "peach" 创建一个hashtab ...
- 前端开发:setTimeout与setInterval 定时器与异步循环数组
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的, ...
- GridView中显示时间日期格式问题
以下都是GridView基本常用的日期,时间格式 形式 语法 结果 注释 数字 {0:N2} 12.36 数字 {0:N0} 13 货币 {0:c2} $12.36 货币 {0:c4} $ ...
- C#开发微信门户及应用(4)--关注用户列表及详细信息管理
在上个月的对C#开发微信门户及应用做了介绍,写过了几篇的随笔进行分享,由于时间关系,间隔了一段时间没有继续写这个系列的博客了,并不是对这个方面停止了研究,而是继续深入探索这方面的技术,为了更好的应用起 ...
- 网页mp3语音展示,点击图片放大,点击图片跳转链接,调表格
查看mp3语音 <td class="value"><embed src="${sounds.soundName}" type="a ...
- 如何:加载分页结果(WCF 数据服务)
WCF 数据服务 允许数据服务限制单个响应源中返回的实体数.在此情况下,源中的最后一项包含指向下一页数据的链接.通过调用执行 DataServiceQuery 时返回的 QueryOperationR ...
- iOS中的各种id
 网卡Mac地址会随机化