获得与先前定义的字符串集

时间:2017-05-30 12:59:47

标签: c++ string match prefix

假设我有一组前缀,例如[" a"," ab"," ba"," aba", " BBB"。]

我也有一个单词列表。对于此列表中的每个单词,例如" abad",我希望有效地获得该单词的所有前缀,这些前缀与前缀集中的单词匹配。在这个例子中,我想作为输出[" a"," ab"," aba"]。

我想只使用std。

中的结构

我正在考虑某种树形结构,但我无法想到一种相对容易实现它的方法。

5 个答案:

答案 0 :(得分:1)

一个简单的实现是使用std :: unordered_set的哈希表,然后将列表中每个单词的每个前缀与集合进行比较。

#include <iostream>
#include <string>
#include <unordered_set>
#include <vector>

int main ()
{
    std::unordered_set<std::string> myPrefixes = {"a", "ab", "ba", "aba", "bbb"};

    std::vector<std::string> listOfWords;

    for (int i = 0; i < listOfWords.size(); i++) {
        std::vector<std::string> result;
        std::string word = listOfWords[i];
        for (int j = 0; j < word.length() - 1; j++) {
            if (myPrefixes.count(word.substr(0, word.length - j)) > 0) {
                result.push_back(word.substr(0, word.length - j);
            }
        }
        // print the result vector or do whatever with it
    }
    return 0;
}

答案 1 :(得分:1)

  1. 将前缀存储在std::vector<std::string>
  2. std::sort()向量
  3. 对于每个感兴趣的单词,使用std::mismatch()查找不匹配的字符,如果所有前缀都匹配,那么您就有匹配
  4. 如果部分匹配,请中断
  5. 您不需要任何特殊的数据结构。会不会很快,可能不如特里快,它是否有效 - 最有可能。它是否有效 - 可能 - 取决于前缀和单词。

答案 2 :(得分:1)

这个答案通过使用trie来增加性能,这可能会非常巨大。假设M个前缀单词以及单词到搜索平均N个字母,使用set的上述过程的复杂性花费O(N ^ 2)时间来查找{的前缀{1}}字母。对于初始O(MN)预处理成本,Trie方法可以将搜索降低到O(N)。

有趣的是,Trie构建部分(N struct和Node函数下面)实际上只需要7个实线。

insert

答案 3 :(得分:0)

我认为trie是一种狡猾的方式。但我不知道是否有std trie。 通过trie,您可以非常快速地检查前缀。

你的特里会看起来像这样:

enter image description here

红色节点是端节点...所以从顶部到红色节点是前缀。

如果你只能使用std的东西,你可以编写一个类节点。在这个类中,你有一个孩子的std :: map。如果你的trie中有超过a和b,那么地图将帮助你快速找到正确的子节点......如果你使用汉字或其他字母......(只有少数元素你应该更好地使用std: :载体)

您还需要一种方法来添加前缀。 之后你只需要一个方法来检查给定的单词是否是一个前缀,方法是通过节点和映射来检查我们是否通过了一个红色节点。

答案 4 :(得分:0)

正如已经提到的,trie是开始看起来的开始,但是有些Radix tree可能是,但是有很多选项,但不幸的是,它们中没有明确的标准。如果你想要快速和实用的东西,我知道{C}描述的this article,但在C ++中很容易实现。