力扣每日一题 2021/10/19

  1. 1. 211.添加与搜索单词-数据结构设计
  2. 2. 解题思路
  3. 3. 解题代码

211.添加与搜索单词-数据结构设计

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

实现词典类 WordDictionary :

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

原文链接

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
输入:
["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

解题思路

整个字典是一个Map,map存储一个String的列表,以word的长度为key,当查找的时候,通过长度找出列表,列表中遍历查找对应的单词。

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class algorithm211 {
@Test
public void test(){
WordDictionary dictionary = new WordDictionary();
dictionary.addWord("bad");
dictionary.addWord("dad");
System.out.println(dictionary.search("pad"));
System.out.println(dictionary.search("bad"));
System.out.println(dictionary.search(".ad"));
System.out.println(dictionary.search("b.."));
}

class WordDictionary {
private Map<Integer, List<String>> dictionary = null;
/** Initialize your data structure here. */
public WordDictionary() {
dictionary = new HashMap<>();
}

/** Adds a word into the data structure. */
public void addWord(String word) {
List<String> list = dictionary.get(word.length());
if(list == null){
list = new ArrayList<>();
}
list.add(word);
dictionary.put(word.length(),list);
}

/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
public boolean search(String word) {
int len = word.length();
List<String> list = dictionary.get(len);
boolean flag = false;
for(String str : list){
boolean f = true;
for(int i = 0;i < len;i++){
if(word.charAt(i) != '.'){
if(word.charAt(i) != str.charAt(i))
f = false;
}
}
if(f){
flag = true;
break;
}
}
return flag;
}
}
}