有效地从一组中获取字符串“startingWith”的子集

时间:2015-04-16 13:55:46

标签: java algorithm dictionary substring subset

我有一个字符串集,我想为它创建一个autosuggest功能。

假设该集合为["foo", "fighter"]

键入"f"应返回两个值,输入"fo"只应返回"foo"

目前,我只是通过调用startsWith来迭代设置和归档结果,但它太慢了。

标准TreeSet及其子集函数在这里没有多大帮助,因为它只实现了一个RB树。

Java API中是否有高效的解决方案,还是我必须构建自己的Set实现?


编辑: 我的实现看起来像这样,使用Andrey Naumenkos trie datastructures。如果要使用扩展ASCII字符,请注意增加数组大小。如果您使用List代替Map,则会按排序顺序获得结果。

public Set<String> getSubset(String s) {
    result = new HashSet<String>();
    getSubset(root, s);
    return result;
}

private void getSubset(TrieNode node, String s) {
    TrieNode n = node;
    for (char ch : s.toCharArray()) {
        if (n.children[ch] != null) {
            n = n.children[ch];
            continue;
        }
        return;
    }
    getSubsetR(n, s);
}

private void getSubsetR(TrieNode node, String s) {
    for (char ch = 0; ch < node.children.length; ch++) {
        TrieNode child = node.children[ch];
        if (child != null)
            getSubsetR(child, s + ch);
    }
    if (node.leaf) {
        result.add(s);
    }
}

1 个答案:

答案 0 :(得分:11)

您要寻找的是前缀树数据结构:http://en.wikipedia.org/wiki/Trie

此处的代码可以帮助您入门:https://sites.google.com/site/indy256/algo/trie