LeetCode-每日一题 211. 添加与搜索单词 - 数据结构设计 [Java实现]

请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。

实现词典类 WordDictionary :

  • WordDictionary() 初始化词典对象
  • void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配
  • bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回  false 。word 中可能包含一些 '.' ,每个 . 都可以表示任何一个字母。

示例:

输入:
["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
输出:
[null,null,null,null,false,true,true,true]

解释:
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // return False
wordDictionary.search("bad"); // return True
wordDictionary.search(".ad"); // return True
wordDictionary.search("b.."); // return True

提示:

  • 1 <= word.length <= 500
  • addWord 中的 word 由小写英文字母组成
  • search 中的 word 由 '.' 或小写英文字母组成
  • 最多调用 50000 次 addWord 和 search

方法一:哈希表

        由题可知该题的要点在于search方法,即如何实现一个高效的仅需查找关键字词的方法是我们主要关心的事,基于此方法我们可以分析出以下要点:

  • 分析方法传参可知一个 '.' 仅相当于一个任意字符,而待查询字符串长度仍然不变。
  • 对于一个待查询的字符串,其内部除 '.' 外字符应是有序的

        故在查找和记录数据时,我们可以以字符串长度作为判据,分类储存、筛选输入。基于上述几点我们可以编写以下程序

class WordDictionary {
        private final HashMap> storeMap = new HashMap<>(7);

        public void addWord(String word) {
            int length = word.length();
            List chars = storeMap.get(length);
            if (chars == null) {
                List list = new ArrayList<>();
                list.add(word.toCharArray());
                storeMap.put(length, list);
            } else {
                chars.add(word.toCharArray());
            }
        }

        public boolean search(String word) {
            List chars = storeMap.get(word.length());
            if (chars == null) return false;
            for (char[] storedWord : chars) {
                int i;
                for (i = 0; i < word.length(); ++ i) {
                    if (word.charAt(i) == '.') continue;
                    if (storedWord[i] != word.charAt(i)) break;
                }
                if (i == word.length()) return true;
            }
            return false;
        }

    }

你可能感兴趣的:(LeetCode,数据结构,leetcode,java)