Skip to content

Commit c2c0227

Browse files
committed
word break
1 parent ca35023 commit c2c0227

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

word-break/se6816.java

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/**
2+
Tries 자료구조를 구현하고, 이를 통해 단어를 탐색하는 방식
3+
visited[] 방문 배열을 추가하여, 이전에 방문했던 인덱스에 대해서는 무시
4+
*/
5+
class WordMap {
6+
public Map<Character, WordNode> wordMap;
7+
8+
public WordMap() {
9+
wordMap = new HashMap<>();
10+
}
11+
12+
public List<Integer> search(String word, int idx) {
13+
List<Integer> idxList = new ArrayList<>();
14+
15+
WordNode wordNode = null;
16+
char ch = word.charAt(idx);
17+
wordNode = wordMap.get(ch);
18+
if (wordNode == null) return idxList;
19+
20+
if(wordNode.isLeaf) {
21+
idxList.add(idx + 1);
22+
}
23+
idx++;
24+
25+
for(; idx < word.length(); idx++) {
26+
char target = word.charAt(idx);
27+
if (!wordNode.next.containsKey(target)) {
28+
break;
29+
}
30+
wordNode = wordNode.next.get(target);
31+
if (wordNode.isLeaf) {
32+
idxList.add(idx + 1);
33+
}
34+
}
35+
36+
return idxList;
37+
}
38+
39+
public void add(String word) {
40+
WordNode wordNode = null;
41+
char ch = word.charAt(0);
42+
wordNode = wordMap.get(ch);
43+
44+
if(wordNode == null) {
45+
boolean isFirstWord = word.length() == 1;
46+
wordNode = new WordNode(ch, isFirstWord);
47+
wordMap.put(ch, wordNode);
48+
}
49+
50+
for(int idx = 1; idx < word.length(); idx++) {
51+
char target = word.charAt(idx);
52+
boolean isLeaf = word.length() - 1 == idx;
53+
wordNode = wordNode.next.computeIfAbsent(target, key -> new WordNode(key, isLeaf));
54+
}
55+
56+
wordNode.isLeaf = true;
57+
58+
}
59+
60+
}
61+
62+
class WordNode {
63+
char ch;
64+
Map<Character, WordNode> next;
65+
boolean isLeaf;
66+
67+
public WordNode(char ch) {
68+
this(ch, false);
69+
}
70+
71+
public WordNode(char ch, boolean isLeaf) {
72+
next = new HashMap<>();
73+
this.ch = ch;
74+
this.isLeaf = isLeaf;
75+
}
76+
77+
}
78+
79+
class Solution {
80+
public static WordMap wordMap;
81+
public boolean wordBreak(String s, List<String> wordDict) {
82+
boolean[] visited = new boolean[s.length()];
83+
initWordMap(wordDict);
84+
if(s.length() == 1) return wordMap.wordMap.containsKey(s.charAt(0)) && wordMap.wordMap.get(s.charAt(0)).isLeaf;
85+
86+
Queue<Integer> que = new LinkedList<>();
87+
boolean result = false;
88+
que.add(0);
89+
visited[0] = true;
90+
loop:
91+
while(!que.isEmpty()) {
92+
int idx = que.poll();
93+
List<Integer> idxList = wordMap.search(s, idx);
94+
for(int i : idxList) {
95+
if(i == s.length()) {
96+
result = true;
97+
break loop;
98+
}
99+
100+
if(!visited[i]) {
101+
que.add(i);
102+
visited[i] = true;
103+
}
104+
}
105+
}
106+
107+
return result;
108+
109+
110+
111+
}
112+
113+
public void initWordMap(List<String> wordDict) {
114+
wordMap = new WordMap();
115+
for(String word : wordDict) {
116+
wordMap.add(word);
117+
}
118+
}
119+
}
120+

0 commit comments

Comments
 (0)