add new solutions
This commit is contained in:
parent
14cd11f1c7
commit
d7aba91105
1 changed files with 105 additions and 0 deletions
105
solutions/2/q208/solution.go
Normal file
105
solutions/2/q208/solution.go
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
package q208
|
||||||
|
|
||||||
|
type tNode struct {
|
||||||
|
str string
|
||||||
|
childs [26]*tNode
|
||||||
|
hasWord bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *tNode) index() int { return index(n.str) }
|
||||||
|
|
||||||
|
func (n *tNode) split(prefixLen int) (*tNode, *tNode) {
|
||||||
|
if len(n.str) < prefixLen {
|
||||||
|
panic("cannot split node")
|
||||||
|
}
|
||||||
|
if len(n.str) == prefixLen {
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix := n.str[:prefixLen]
|
||||||
|
n.str = n.str[prefixLen:]
|
||||||
|
p := &tNode{str: prefix}
|
||||||
|
p.childs[n.index()] = n
|
||||||
|
return p, n
|
||||||
|
}
|
||||||
|
|
||||||
|
func commonPrefix(a, b string) int {
|
||||||
|
minLen := min(len(a), len(b))
|
||||||
|
for i := range minLen {
|
||||||
|
if a[i] != b[i] {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minLen
|
||||||
|
}
|
||||||
|
|
||||||
|
func index(str string) int {
|
||||||
|
if len(str) > 0 {
|
||||||
|
return int(str[0] - 'a')
|
||||||
|
}
|
||||||
|
return -1 // root
|
||||||
|
}
|
||||||
|
|
||||||
|
type Trie struct {
|
||||||
|
root *tNode
|
||||||
|
}
|
||||||
|
|
||||||
|
func Constructor() Trie {
|
||||||
|
return Trie{
|
||||||
|
root: &tNode{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Trie) Insert(word string) {
|
||||||
|
node := t.root
|
||||||
|
for len(word) > 0 {
|
||||||
|
idx := index(word)
|
||||||
|
next := node.childs[idx]
|
||||||
|
if next != nil {
|
||||||
|
pflen := commonPrefix(word, next.str)
|
||||||
|
next, _ = next.split(pflen)
|
||||||
|
node.childs[next.index()] = next
|
||||||
|
word = word[pflen:]
|
||||||
|
} else {
|
||||||
|
next = &tNode{str: word}
|
||||||
|
word = ""
|
||||||
|
node.childs[idx] = next
|
||||||
|
}
|
||||||
|
node = next
|
||||||
|
}
|
||||||
|
node.hasWord = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Trie) Search(word string) bool {
|
||||||
|
node := t.root
|
||||||
|
for len(word) > 0 {
|
||||||
|
next := node.childs[index(word)]
|
||||||
|
if next == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
pflen := commonPrefix(word, next.str)
|
||||||
|
if pflen != len(next.str) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
word = word[pflen:]
|
||||||
|
node = next
|
||||||
|
}
|
||||||
|
return node.hasWord
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Trie) StartsWith(prefix string) bool {
|
||||||
|
node := t.root
|
||||||
|
for len(prefix) > 0 {
|
||||||
|
next := node.childs[index(prefix)]
|
||||||
|
if next == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
pflen := commonPrefix(prefix, next.str)
|
||||||
|
if pflen != len(next.str) && pflen != len(prefix) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
prefix = prefix[pflen:]
|
||||||
|
node = next
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue