1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use super::basic::{Leaf, Node, Trie};
use std::cell::RefCell;
use std::cmp::Eq;
use std::hash::Hash;
use std::rc::Rc;

#[derive(Debug)]
pub struct WordTrie {
    inner: Rc<RefCell<Node<String>>>,
}

impl WordTrie {
    fn new() -> WordTrie {
        WordTrie { inner: Node::new() }
    }

    fn insert_words(&self, words: &str, target: &str) {
        let m_words = WordTrie::split_words(words);
        self.insert(&m_words, target.to_string())
    }

    fn split_words(words: &str) -> Vec<String> {
        let res: Vec<String> = words.chars().map(|word| word.to_string()).collect();
        res
    }

    fn insert(&self, words: &[String], target: String) {
        let mut leaf = Leaf::<String>::Nil;
        if target != "".to_string() {
            leaf = Leaf::<String>::End(target);
        }
        Node::insert_seq(self.inner.clone(), words, leaf);
    }

    fn get_leaf(&self, words: &[String]) -> Leaf<String> {
        Node::get_leaf(self.inner.clone(), words)
    }
}

#[test]
fn test_word() {
    let word_trie = WordTrie::new();
    let seq = "你在干什么";
    let seq1 = "你在找什么";
    word_trie.insert_words(seq, "没干嘛");
    word_trie.insert_words(seq1, "是吗");
    println!("{:?}", word_trie);
    assert!(true);
}