Skip to content

Commit 718e09c

Browse files
committed
add alien dictionary solution
1 parent 15a159c commit 718e09c

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

โ€Žalien-dictionary/Tessa1217.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import java.util.*;
2+
3+
public class Solution {
4+
5+
/**
6+
* @param words: a list of words
7+
* @return: a string which is correct order
8+
*/
9+
// ๋ผํ‹ด ์•ŒํŒŒ๋ฒณ์„ ์“ฐ๋Š” ์ƒˆ๋กœ์šด ์™ธ๊ณ„ ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ž์˜ ์ˆœ์„œ๋Š” ์•Œ์ง€ ๋ชปํ•œ๋‹ค.
10+
// ์ƒˆ๋กœ์šด ์–ธ์–ด์˜ ๊ทœ์น™์— ๋งž๋Š” ์‚ฌ์ „์‹ ์ˆœ์„œ(์•ŒํŒŒ๋ฒณ ์ˆœ์„œ)๋กœ ์ •์˜๋œ non-empty(๋น„์ง€ ์•Š์€ ์ƒํƒœ์ธ) ๋‹จ์–ด ๋ชฉ๋ก์„ ๋ฐ›์•˜๋‹ค.
11+
// ์ด ์–ธ์–ด์˜ ์ˆœ์„œ๋ฅผ ์ฐพ์œผ์‹œ์˜ค.
12+
public String alienOrder(String[] words) {
13+
14+
// wrt wrf => wr์€ ๊ณตํ†ต t๊ฐ€ f๋ณด๋‹ค ๋จผ์ € ๋‚˜์™”์œผ๋ฏ€๋กœ t < f
15+
// wrt er => w๋ณด๋‹ค e๊ฐ€ ๋’ค์— ๋‚˜์™”์œผ๋ฏ€๋กœ w < e
16+
// er ett => r์ด t๋ณด๋‹ค ๋’ค์— ๋‚˜์™”์œผ๋ฏ€๋กœ r < t
17+
// ett rftt => r์ด e๋ณด๋‹ค ๋’ค์— ๋‚˜์™”์œผ๋ฏ€๋กœ e < r
18+
19+
Map<Character, Set<Character>> graph = new HashMap<>();
20+
Map<Character, Integer> char_order = new HashMap<>();
21+
22+
for (String word : words) {
23+
for (char c : word.toCharArray()) {
24+
graph.putIfAbsent(c, new HashSet<>());
25+
char_order.putIfAbsent(c, 0);
26+
}
27+
}
28+
29+
for (int i = 0; i < words.length - 1; i++) {
30+
String cur_word = words[i];
31+
String next_word = words[i + 1];
32+
33+
if (cur_word.length() > next_word.length() && cur_word.startsWith(next_word)) {
34+
return "";
35+
}
36+
37+
// ๋น„๊ต: (wrt, wrf) => t์™€ f ๋น„๊ต
38+
// ๋น„๊ต: (wrf, er) => w์™€ e ๋น„๊ต
39+
for (int j = 0; j < Math.min(cur_word.length(), next_word.length()); j++) {
40+
char c1 = cur_word.charAt(j);
41+
char c2 = next_word.charAt(j);
42+
43+
// from "wrt"and"wrf" ,we can get 't'<'f'
44+
// from "wrt"and"er" ,we can get 'w'<'e'
45+
// from "er"and"ett" ,we can get 'r'<'t'
46+
// from "ett"and"rftt" ,we can get 'e'<'r'
47+
// ์ˆœ์„œ ์ €์žฅ
48+
if (c1 != c2) {
49+
if (!graph.get(c1).contains(c2)) {
50+
graph.get(c1).add(c2);
51+
char_order.put(c2, char_order.get(c2) + 1);
52+
}
53+
break;
54+
}
55+
}
56+
}
57+
58+
Queue<Character> queue = new LinkedList<>();
59+
for (char c : char_order.keySet()) {
60+
// ์ตœ์ƒ์œ„ ๋ถ€ํ„ฐ queue์— ์‚ฝ์ž… => w
61+
if (char_order.get(c) == 0) {
62+
queue.offer(c);
63+
}
64+
}
65+
66+
StringBuilder sb = new StringBuilder();
67+
while (!queue.isEmpty()) {
68+
char cur = queue.poll();
69+
sb.append(cur);
70+
71+
// ์—ฐ๊ด€ ๊ธ€์ž๋“ค์˜ ์ˆœ์„œ ์กฐ์ • => w์˜ ์—ฐ๊ด€ ๊ธ€์ž๋“ค => e, e์™€ ์—ฐ๊ด€ ๊ธ€์ž๋“ค => t, t์™€ ์—ฐ๊ด€ ๊ธ€์ž๋“ค => f ...
72+
for (char linked_char : graph.get(cur)) {
73+
char_order.put(linked_char, char_order.get(linked_char) - 1);
74+
if (char_order.get(linked_char) == 0) {
75+
queue.offer(linked_char);
76+
}
77+
}
78+
}
79+
80+
if (sb.length() != char_order.size()) {
81+
return "";
82+
}
83+
84+
return sb.toString();
85+
86+
}
87+
88+
}
89+
90+
91+

0 commit comments

Comments
ย (0)