题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5af18ba2eb45443aa91a11e848aa6723
照理说简单题不应该考这种内容, 但是我做算法历来的习惯就是不调语言的 api, 允许的话那 Python 做算法也太轻松了
第一反应是字典树, 实现了一下, 就是第一次 submit 没想到还有重复值
package main
import (
"fmt"
)
type TrieNode struct {
Char string
Children []*TrieNode
Endpoint bool
Count int
}
func NewTrieNode(c string) *TrieNode {
children := make([]*TrieNode, 52)
return &TrieNode{Char: c, Children: children, Endpoint: false}
}
type Trie struct {
Root *TrieNode
}
func (t *Trie) AddNode(word string) {
node := t.Root
for i := 0; i < len(word); i++ {
c := word[i]
idx := c - 'A'
if idx > 25 {
idx -= 6
}
if node.Children[idx] == nil {
node.Children[idx] = NewTrieNode(string(c))
}
if i == len(word)-1 {
node.Children[idx].Endpoint = true
node.Children[idx].Count++
}
node = node.Children[idx]
}
}
func traverseNode(node *TrieNode, path string) {
if node.Endpoint {
for i := 0; i < node.Count; i++ {
fmt.Println(path + node.Char)
}
}
for _, n := range node.Children {
if n != nil {
traverseNode(n, path+node.Char)
}
}
}
func (t *Trie) Traverse() {
traverseNode(t.Root, "")
}
func NewTrie() *Trie {
return &Trie{Root: NewTrieNode("")}
}
func main() {
n := 0
fmt.Scan(&n)
t := NewTrie()
s := ""
for {
m, _ := fmt.Scan(&s)
if m == 0 {
break
} else {
t.AddNode(s)
}
}
t.Traverse()
}
OPPO公司福利 1175人发布