|
@@ -1,9 +1,5 @@
|
|
|
package main
|
|
|
|
|
|
-import (
|
|
|
- "fmt"
|
|
|
-)
|
|
|
-
|
|
|
func findLadders(beginWord string, endWord string, wordList []string) (ladders [][]string) {
|
|
|
endIdx, listLen := -1, len(wordList)
|
|
|
for i := 0; i < listLen; i++ {
|
|
@@ -17,15 +13,13 @@ func findLadders(beginWord string, endWord string, wordList []string) (ladders [
|
|
|
} // Find end word in word list, if not found, return false
|
|
|
adj := make([][]int, listLen)
|
|
|
for i := 0; i < listLen; i++ {
|
|
|
- adj[i] = make([]int, 0)
|
|
|
for j := i + 1; j < listLen; j++ {
|
|
|
if isConvertible(wordList[i], wordList[j]) {
|
|
|
- adj[i] = append(adj[i], j)
|
|
|
+ adj[i] = append(adj[i], j) // Dont need to init each row of adj if use append
|
|
|
adj[j] = append(adj[j], i)
|
|
|
}
|
|
|
}
|
|
|
} // Create adj matrix
|
|
|
- fmt.Println(adj)
|
|
|
visited := make([]bool, listLen)
|
|
|
closest := make([]int, 0)
|
|
|
distance := make([]int, listLen) // Distance from begin to word i
|
|
@@ -33,10 +27,10 @@ func findLadders(beginWord string, endWord string, wordList []string) (ladders [
|
|
|
for i := 0; i < listLen; i++ {
|
|
|
prev[i] = make([]int, 0)
|
|
|
if isConvertible(beginWord, wordList[i]) {
|
|
|
- visited[i] = true
|
|
|
prev[i] = append(prev[i], -1) // -1 means begin word
|
|
|
closest = append(closest, i)
|
|
|
distance[i] = 1
|
|
|
+ visited[i] = true
|
|
|
}
|
|
|
} // Init closest array
|
|
|
for distance[endIdx] == 0 && len(closest) != 0 {
|
|
@@ -57,20 +51,17 @@ func findLadders(beginWord string, endWord string, wordList []string) (ladders [
|
|
|
}
|
|
|
closest = newClosest
|
|
|
}
|
|
|
- fmt.Println(prev)
|
|
|
- var getLadders func(int, []string)
|
|
|
+ var getLadders func(int, []string) // Get ladders from prev path
|
|
|
getLadders = func(idx int, ladder []string) {
|
|
|
- newLadder := make([]string, len(ladder))
|
|
|
- copy(newLadder, ladder)
|
|
|
+ var newLadder []string
|
|
|
if idx == -1 {
|
|
|
- newLadder = append(newLadder, beginWord)
|
|
|
- for beg, end := 0, len(newLadder)-1; beg < end; beg, end = beg+1, end-1 {
|
|
|
- newLadder[beg], newLadder[end] = newLadder[end], newLadder[beg]
|
|
|
- }
|
|
|
+ newLadder = []string{beginWord}
|
|
|
+ newLadder = append(newLadder, ladder...)
|
|
|
ladders = append(ladders, newLadder)
|
|
|
return
|
|
|
}
|
|
|
- newLadder = append(newLadder, wordList[idx])
|
|
|
+ newLadder = []string{wordList[idx]}
|
|
|
+ newLadder = append(newLadder, ladder...)
|
|
|
for i := range prev[idx] {
|
|
|
getLadders(prev[idx][i], newLadder)
|
|
|
}
|
|
@@ -92,17 +83,17 @@ func isConvertible(a, b string) bool {
|
|
|
return diff == 1
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
- fmt.Println(findLadders(
|
|
|
- "hit",
|
|
|
- "cog",
|
|
|
- []string{"hot", "dot", "dog", "lot", "log", "cog"}))
|
|
|
- fmt.Println(findLadders(
|
|
|
- "hit",
|
|
|
- "cog",
|
|
|
- []string{"hot", "dot", "dog", "lot", "log"}))
|
|
|
- fmt.Println(findLadders(
|
|
|
- "hot",
|
|
|
- "dog",
|
|
|
- []string{"hot", "dog", "dot"}))
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// fmt.Println(findLadders(
|
|
|
+// "hit",
|
|
|
+// "cog",
|
|
|
+// []string{"hot", "dot", "dog", "lot", "log", "cog"}))
|
|
|
+// fmt.Println(findLadders(
|
|
|
+// "hit",
|
|
|
+// "cog",
|
|
|
+// []string{"hot", "dot", "dog", "lot", "log"}))
|
|
|
+// fmt.Println(findLadders(
|
|
|
+// "hot",
|
|
|
+// "dog",
|
|
|
+// []string{"hot", "dog", "dot"}))
|
|
|
+// }
|