摘要:题目内容这题也是锁住的,通过率只有左右。另外,字典里面只有两个的时候,也是返回。最后再说两句距离上一篇文章过了一段时间了,这段时间搬家再适应新环境,解决心理问题。
题目内容
An abbreviation of a word follows the form. 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 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
这题也是锁住的,通过率只有15%左右。这让我不得其解,为啥一道easy级别的题目会有如此低的Pass?是人性的扭曲还是道德的沦丧,美国没有《走近科学》,只能自己动手写。
解决思路这题比较考察洋文水平,扫一眼要求很容易看出,应该把已有的dictionary的缩略词都缩出来,存到一个地方,刚开始用了个Set。再调用isUnique的时候,用目标字符串压缩后和Set里面的元素做比较。有相同的就返回false,没有就是true。
但是,
后来出了问题,因为目标词可能和字典里面的词一致,比如字典里只有有"hello",调用isUnique检查hello的时候,应该返回true,因为没有其他词和h3o一样了。另外,字典里面只有两个hello的时候,也是返回true。所以这题的关键点在于『no other word』
public class ValidWordAbbr { Map复杂度分析> map = new HashMap<>(); public ValidWordAbbr(String[] dictionary) { //每个词都轮一遍 for (String str : dictionary) { String abrv = abbrev(str); if (!map.containsKey(abrv)){ ArrayList list = new ArrayList<>(); list.add(str); map.put(abrv,list); } else { ArrayList list = map.get(abrv); //这里的判断是过滤相同的词 if (!list.contains(str)) list.add(str); map.put(abrv, list); } } } public boolean isUnique(String word) { String abrv = abbrev(word); if (map.containsKey(abrv)){ //先看相同压缩串是不是代表多个词,一旦多了那肯定不行 if (map.get(abrv).size() > 1) return false; //如果只有1个,那就对比一下这两个词是不是一样的,一样就行 else if (map.get(abrv).get(0).equals(word)) return true; return false; } //其他情况肯定是都行。 return true; } //把字符串变成压缩串 public String abbrev(String word){ if(word == null || word.length() < 3){ return word; } //把头,数字,尾巴连起来。 StringBuilder sb = new StringBuilder(); int len = word.length()-2; String slen = String.valueOf(len); sb.append(word.charAt(0)); sb.append(slen); sb.append(word.charAt(word.length()-1)); return sb.toString(); } //做测试用 public static void main(String[] args) { String[] test = {"hello", "a", "a"}; ValidWordAbbr vwa = new ValidWordAbbr(test); System.out.print(vwa.isUnique("a")); } }
截至目前,我还不太清楚这种设计题会不会特别在意复杂度,可能更注重corner case。这题遍历一遍字典就可以了,所以复杂度是O(n)。需要注意的是no other word这个说法,让我多付出了两次submit的代价,不过还好比15%高一些。
最后再说两句距离上一篇文章过了一段时间了,这段时间搬家再适应新环境,解决心理问题。从这一篇开始将会继续保持更新进度。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65064.html
摘要:链接注意第一个数字是的情况,这种也是不合法的。还有一个注意的就是要想和有相同的缩写,长度必须和它相同,所以只保留长度相同的。注意剪枝,当前长度已经超过就不需要继续了。二进制的做法是这样的,先对字典里面的单词进行处理。 Valid Word Abbreviation 链接:https://leetcode.com/problems... 注意第一个数字是0的情况,[a, 01]这种也是不...
摘要:题目内容比较不同的版本号,并根据大小返回,或。并提醒版本意思是第二代的第五次升级,反正不是数字上的的意思。代码拆分两个字符串这里用最大的长度作为循环范围因为循环范围是最大长度,所以缺的位置补复杂度分析,和分别是两个字符串的长度。 题目内容 比较不同的版本号,并根据大小返回-1,1或0。并提醒2.5版本意思是第二代的第五次升级,反正不是数字上的2.5的意思。 解决思路 直观的想法是,找到...
摘要:所以这题先建立一个对应的,然后扫一遍字符串就可以了。复杂度分析第二题题目内容解决思路一看关键词,通常都是,深搜一遍,挖地三尺,雁过拔毛。复杂度分析第三题题目内容解决思路复杂度分析 该系列共三道题,Company Tag只有一个Google,那就必须要做了。 第一题题目内容 A strobogrammatic number is a number that looks the same ...
摘要:解决思路有一首歌名是下一个天亮,不过和这道题没什么关系。根据这两个例子猜测,需要两个辅助的方法,一个是交换,另一个是逆序。所以第一步的思路就是从后往前找,找一对儿符合要求的相邻数字。这道题的关键在于,找到规律,数学上的规律。 题目内容 给出一个数组,重新排列,返回『下一个排列,题目的描述中还给出了几个例子。 解决思路 有一首歌名是下一个天亮,不过和这道题没什么关系。还有一类题是已有一堆...
摘要:题目内容因为这道题被锁住了,在写这篇文章时还有天就要过期了,把原题也贴上来。题目要求,树的结构是每个当右边子节点的,它肯定有个,就是它的根节点肯定有个左边子节点,也就是说它是二胎。递归设置终止条件,在空节点或最左边的叶子处终止。 题目内容 Given a binary tree where all the right nodes are either leaf nodes with a...
阅读 2910·2021-11-22 15:25
阅读 2218·2021-11-18 10:07
阅读 991·2019-08-29 15:29
阅读 448·2019-08-29 13:25
阅读 1477·2019-08-29 12:58
阅读 3141·2019-08-29 12:55
阅读 2877·2019-08-29 12:28
阅读 462·2019-08-29 12:16