Skip to content

Commit 7b1d88b

Browse files
committed
design add and search words data structure
1 parent 2febe1b commit 7b1d88b

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/**
2+
Tries + BFS를 활용한 방식
3+
addWord()
4+
문자열 word의 길이 -> N
5+
시간 복잡도 : O(N)
6+
공간 복잡도 : O(N)
7+
search()
8+
Tries 내부의 노드 개수 -> M
9+
시간 복잡도 : O(M)
10+
공간 복잡도 : O(M)
11+
*/
12+
class WordDictionary {
13+
public Map<Character, WordNode> wordMap;
14+
15+
public WordDictionary() {
16+
wordMap = new HashMap<>();
17+
}
18+
19+
public void addWord(String word) {
20+
WordNode wordNode = null;
21+
char ch = word.charAt(0);
22+
wordNode = wordMap.get(ch);
23+
24+
if(wordNode == null) {
25+
boolean isFirstWord = word.length() == 1;
26+
wordNode = new WordNode(ch, isFirstWord);
27+
wordMap.put(ch, wordNode);
28+
}
29+
30+
for(int idx = 1; idx < word.length(); idx++) {
31+
char target = word.charAt(idx);
32+
boolean isLeaf = word.length() - 1 == idx;
33+
wordNode = wordNode.next.computeIfAbsent(target, key -> new WordNode(key, isLeaf));
34+
}
35+
wordNode.isLeaf = true;
36+
37+
38+
}
39+
40+
public boolean search(String word) {
41+
Queue<Node> que = new ArrayDeque<>();
42+
boolean result = false;
43+
char ch = word.charAt(0);
44+
WordNode wordNode = wordMap.get(ch);
45+
int len = word.length();
46+
47+
if(ch == '.' && wordMap.size() != 0) {
48+
for(Map.Entry<Character, WordNode> entry : wordMap.entrySet()) {
49+
que.add(new Node(entry.getValue(), 1));
50+
}
51+
}
52+
53+
if (wordNode != null) {
54+
que.add(new Node(wordNode, 1));
55+
}
56+
57+
58+
59+
while(!que.isEmpty()) {
60+
Node node = que.poll();
61+
if(node.idx == len && node.wordNode.isLeaf) {
62+
result = true;
63+
break;
64+
}
65+
66+
if(node.idx == len) {
67+
continue;
68+
}
69+
70+
char target = word.charAt(node.idx);
71+
72+
if(target == '.' && node.wordNode.next.size() != 0) {
73+
for(Map.Entry<Character, WordNode> entry : node.wordNode.next.entrySet()) {
74+
que.add(new Node(entry.getValue(), node.idx + 1));
75+
}
76+
continue;
77+
}
78+
79+
80+
if (!node.wordNode.next.containsKey(target)) {
81+
continue;
82+
}
83+
84+
que.add(new Node(node.wordNode.next.get(target), node.idx + 1));
85+
}
86+
87+
return result;
88+
89+
}
90+
}
91+
92+
class Node {
93+
WordNode wordNode;
94+
int idx;
95+
public Node(WordNode wordNode, int idx) {
96+
this.wordNode = wordNode;
97+
this.idx = idx;
98+
}
99+
}
100+
101+
class WordNode {
102+
char ch;
103+
Map<Character, WordNode> next;
104+
boolean isLeaf;
105+
106+
public WordNode(char ch) {
107+
this(ch, false);
108+
}
109+
110+
public WordNode(char ch, boolean isLeaf) {
111+
next = new HashMap<>();
112+
this.ch = ch;
113+
this.isLeaf = isLeaf;
114+
}
115+
116+
}

0 commit comments

Comments
 (0)