| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | 
							- func findWords(board [][]byte, words []string) (ans []string) {
 
- 	trie := &TrieNode{}
 
- 	for i := range words {
 
- 		trie.Insert(words[i])
 
- 	}
 
- 	for y := range board {
 
- 		for x := range board[y] {
 
- 			DFS(board, trie, trie, x, y, &ans, []byte{})
 
- 		}
 
- 	}
 
- 	return
 
- }
 
- func DFS(board [][]byte, trie, curr *TrieNode, x, y int, ans *[]string, prev []byte) {
 
- 	ch := board[y][x]
 
- 	if ch == '*' { // Visited
 
- 		return
 
- 	}
 
- 	curr = curr.OneStepSearch(ch)
 
- 	if curr == nil {
 
- 		return
 
- 	}
 
- 	path := make([]byte, len(prev))
 
- 	copy(path, prev)
 
- 	path = append(path, ch)
 
- 	if curr.IsKey {
 
- 		*ans = append(*ans, string(path))
 
- 		trie.Delete(path)
 
- 	}
 
- 	board[y][x] = '*' // Mark (x, y) as visited
 
- 	if 0 < x {
 
- 		DFS(board, trie, curr, x-1, y, ans, path)
 
- 	}
 
- 	if 0 < y {
 
- 		DFS(board, trie, curr, x, y-1, ans, path)
 
- 	}
 
- 	if x < len(board[0])-1 {
 
- 		DFS(board, trie, curr, x+1, y, ans, path)
 
- 	}
 
- 	if y < len(board)-1 {
 
- 		DFS(board, trie, curr, x, y+1, ans, path)
 
- 	}
 
- 	board[y][x] = ch
 
- }
 
- type TrieNode struct {
 
- 	Cnt      int
 
- 	IsKey    bool
 
- 	Children *[26]TrieNode
 
- }
 
- func (root *TrieNode) Insert(word string) {
 
- 	for i := range word {
 
- 		if root.Children == nil {
 
- 			root.Children = &[26]TrieNode{}
 
- 		}
 
- 		root = &root.Children[int(word[i]-'a')]
 
- 		root.Cnt++
 
- 	}
 
- 	root.IsKey = true
 
- }
 
- func (root *TrieNode) Delete(word []byte) {
 
- 	for i := range word {
 
- 		root = &root.Children[int(word[i]-'a')]
 
- 		root.Cnt--
 
- 	}
 
- 	root.IsKey = false
 
- }
 
- func (root *TrieNode) OneStepSearch(ch byte) *TrieNode {
 
- 	if root.Children == nil {
 
- 		return nil
 
- 	}
 
- 	root = &root.Children[int(ch-'a')]
 
- 	if root.Cnt == 0 {
 
- 		return nil
 
- 	}
 
- 	return root
 
- }
 
 
  |