什么是算法-似乎在使用领域停车页-需要一个无空间的一串字(如“好奇的胡萝卜”),并或多或少正确地将其分解成组成词(如“好奇的胡萝卜”)?

最佳答案

从表示字典的基本Trie数据结构开始当您遍历字符串的字符时,使用一组指针而不是单个指针来搜索trie,这个集合是以trie的根为种子的。对于每个字母,通过字母所指示的指针立即将整个集合向前推进,如果集合元素不能由字母向前推进,则将其从集合中移除。每当到达可能的单词结尾时,向集合中添加一个新的trie根(跟踪与该集合元素相关联的单词列表)最后,处理完所有字符后,返回trie根目录下的任意单词列表如果不止一个,这意味着字符串可以以多种方式被分解(例如“治疗师论坛”,可以被解析为[“治疗师”,“论坛”]或[“强奸犯”,“论坛”]),并且它是未定义的,我们将返回。
或者,在一个错误的伪代码中(java foreach,用parens表示的元组,用大括号表示的集合,cons使用head::tail,[]是空列表):

List<String> breakUp(String str, Trie root) {
    Set<(List<String>, Trie)> set = {([], root)};
    for (char c : str) {
        Set<(List<String>, Trie)> newSet = {};
        for (List<String> ls, Trie t : set) {
            Trie tNext = t.follow(c);
            if (tNext != null) {
                newSet.add((ls, tNext));
                if (tNext.isWord()) {
                    newSet.add((t.follow(c).getWord() :: ls, root));
                }
            }
        }
        set = newSet;
     }
     for (List<String> ls, Trie t : set) {
        if (t == root) return ls;
     }
     return null;
 }

如果我需要澄清或者遗漏了什么,请告诉我。。。

关于algorithm - 分词算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1230373/

10-12 15:21