File tree Expand file tree Collapse file tree 2 files changed +119
-0
lines changed
lcof2/剑指 Offer II 114. 外星文字典 Expand file tree Collapse file tree 2 files changed +119
-0
lines changed Original file line number Diff line number Diff line change @@ -287,6 +287,68 @@ public:
287
287
};
288
288
```
289
289
290
+ #### Go
291
+
292
+ ```go
293
+ func alienOrder(words []string) string {
294
+ n := len(words)
295
+ if n == 0 {
296
+ return ""
297
+ }
298
+ if n == 1 {
299
+ return words[0]
300
+ }
301
+ inDegree := make(map[byte]int)
302
+ graph := make(map[byte][]byte)
303
+ for _, word := range words {
304
+ for i := 0; i < len(word); i++ {
305
+ inDegree[word[i]] = 0
306
+ }
307
+ }
308
+ for i := 0; i < n-1; i++ {
309
+ w1, w2 := words[i], words[i+1]
310
+ minLen := len(w1)
311
+ if len(w2) < minLen {
312
+ minLen = len(w2)
313
+ }
314
+ foundDifference := false
315
+ for j := 0; j < minLen; j++ {
316
+ if w1[j] != w2[j] {
317
+ inDegree[w2[j]]++
318
+ graph[w1[j]] = append(graph[w1[j]], w2[j])
319
+ foundDifference = true
320
+ break
321
+ }
322
+ }
323
+ if !foundDifference && len(w1) > len(w2) {
324
+ return ""
325
+ }
326
+ }
327
+ queue := make([]byte, 0)
328
+ for k := range inDegree {
329
+ if inDegree[k] == 0 {
330
+ queue = append(queue, k)
331
+ }
332
+ }
333
+ res := make([]byte, 0)
334
+ for len(queue) > 0 {
335
+ node := queue[0]
336
+ queue = queue[1:]
337
+ res = append(res, node)
338
+ for _, next := range graph[node] {
339
+ inDegree[next]--
340
+ if inDegree[next] == 0 {
341
+ queue = append(queue, next)
342
+ }
343
+ }
344
+ }
345
+ if len(res) != len(inDegree) {
346
+ return ""
347
+ }
348
+ return string(res)
349
+ }
350
+ ```
351
+
290
352
<!-- tabs: end -->
291
353
292
354
<!-- solution: end -->
Original file line number Diff line number Diff line change
1
+ func alienOrder (words []string ) string {
2
+ n := len (words )
3
+ if n == 0 {
4
+ return ""
5
+ }
6
+ if n == 1 {
7
+ return words [0 ]
8
+ }
9
+ inDegree := make (map [byte ]int )
10
+ graph := make (map [byte ][]byte )
11
+ for _ , word := range words {
12
+ for i := 0 ; i < len (word ); i ++ {
13
+ inDegree [word [i ]] = 0
14
+ }
15
+ }
16
+ for i := 0 ; i < n - 1 ; i ++ {
17
+ w1 , w2 := words [i ], words [i + 1 ]
18
+ minLen := len (w1 )
19
+ if len (w2 ) < minLen {
20
+ minLen = len (w2 )
21
+ }
22
+ foundDifference := false
23
+ for j := 0 ; j < minLen ; j ++ {
24
+ if w1 [j ] != w2 [j ] {
25
+ inDegree [w2 [j ]]++
26
+ graph [w1 [j ]] = append (graph [w1 [j ]], w2 [j ])
27
+ foundDifference = true
28
+ break
29
+ }
30
+ }
31
+ if ! foundDifference && len (w1 ) > len (w2 ) {
32
+ return ""
33
+ }
34
+ }
35
+ queue := make ([]byte , 0 )
36
+ for k := range inDegree {
37
+ if inDegree [k ] == 0 {
38
+ queue = append (queue , k )
39
+ }
40
+ }
41
+ res := make ([]byte , 0 )
42
+ for len (queue ) > 0 {
43
+ node := queue [0 ]
44
+ queue = queue [1 :]
45
+ res = append (res , node )
46
+ for _ , next := range graph [node ] {
47
+ inDegree [next ]--
48
+ if inDegree [next ] == 0 {
49
+ queue = append (queue , next )
50
+ }
51
+ }
52
+ }
53
+ if len (res ) != len (inDegree ) {
54
+ return ""
55
+ }
56
+ return string (res )
57
+ }
You can’t perform that action at this time.
0 commit comments