zoukankan      html  css  js  c++  java
  • 288. 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

    链接: http://leetcode.com/problems/unique-word-abbreviation/

    题解:

    新题的题目真是越来越长了。 这道题是给定一个数组Dictionary, 求输入字符串是否有unique的abbreviation在Dictionary中。我们选择用Map<String, Set<String>>来做我们存储数据的数据结构,然后按照题意做就可以了,还需要判断一些边界条件,比如缩写不在map中直接返回true之类的。 以后一定要牢记,选定了好的数据结构,编写程序就会容易很多。

    Time Complexity - O(n * L), Space Complexity - O(n * L)。

    public class ValidWordAbbr {
        private Map<String, HashSet<String>> map;
        
        public ValidWordAbbr(String[] dictionary) {
            this.map = new HashMap<>();
            for(int i = 0; i < dictionary.length; i++) {
                String abbr = getAbbr(dictionary[i]);
                if(!map.containsKey(abbr)) {
                    HashSet<String> set = new HashSet<>();
                    set.add(dictionary[i]);
                    map.put(abbr, set);
                } else {
                    if(!map.get(abbr).contains(dictionary[i])) {
                        map.get(abbr).add(dictionary[i]);
                    }
                }
            }
        }
    
        public boolean isUnique(String word) {
            if(map.size() == 0 || word.length() < 3) {
                return true;
            }
            String abbr = getAbbr(word);
            if(!map.containsKey(abbr) || (map.get(abbr).contains(word) && map.get(abbr).size() == 1)) {
                return true;    
            } else {
                return false;    
            }
        }
        
        private String getAbbr(String s) {
            if(s.length() < 3) {
                return s;
            } else {
                return s.substring(0, 1) + String.valueOf(s.length() - 2) + s.substring(s.length() - 1);
            }
        }
    }
    
    
    // Your ValidWordAbbr object will be instantiated and called as such:
    // ValidWordAbbr vwa = new ValidWordAbbr(dictionary);
    // vwa.isUnique("Word");
    // vwa.isUnique("anotherWord");

    二刷:

    跟一刷的方法一样。就是跟Anagram一样,用Map<String, Set<String>>来存,使用一个新的方法getAbbr先求出abbr作为key,然后把单词加入到key的value里。  Discuss里面还有很多很好的方法,用map<String, String>之类的,三刷要好好研究。

    Java:

    Time Complexity - O(n * L), Space Complexity - O(n * L)。

    public class ValidWordAbbr {
        Map<String, Set<String>> map;
        public ValidWordAbbr(String[] dictionary) {
            map = new HashMap<>();
            for (String s : dictionary) {
                String abbr = getAbbr(s);
                if (!map.containsKey(abbr)) {
                    map.put(abbr, new HashSet<String>());
                }
                map.get(abbr).add(s);
            }
        }
    
        public boolean isUnique(String word) {
            String abbr = getAbbr(word);
            if (!map.containsKey(abbr) || (map.get(abbr).contains(word) && map.get(abbr).size() == 1)) {
                return true;
            }
            return false;
        }
        
        private String getAbbr(String s) {
            if (s.length() < 3) {
                return s;
            }
            int len = s.length();
            return s.substring(0, 1) + (len - 2) + s.substring(len - 1);
        } 
    }
    
    
    // Your ValidWordAbbr object will be instantiated and called as such:
    // ValidWordAbbr vwa = new ValidWordAbbr(dictionary);
    // vwa.isUnique("Word");
    // vwa.isUnique("anotherWord");

    Reference:

    https://leetcode.com/discuss/62842/a-simple-java-solution-using-map-string-string

    https://leetcode.com/discuss/61658/share-my-java-solution

    https://leetcode.com/discuss/71652/java-solution-with-hashmap-string-string-beats-submissions 

  • 相关阅读:
    INS-30011 输入的ADMIN口令不符合Oracle建议的标准
    INS-30001 ADMIN口令为空
    INS-20802
    ORA-00922:选项缺失或无效
    struts2的配置文件
    Cache Fusion
    MQ配置模板
    RTSP流媒体数据传输的两种方式(TCP和UDP)
    ArcGIS For Flex报错二
    ArcGIS For Flex报错
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5040715.html
Copyright © 2011-2022 走看看