假设我有一组前缀,例如[" a"," ab"," ba"," aba", " BBB"。]
我也有一个单词列表。对于此列表中的每个单词,例如" abad",我希望有效地获得该单词的所有前缀,这些前缀与前缀集中的单词匹配。在这个例子中,我想作为输出[" a"," ab"," aba"]。
我想只使用std。
中的结构我正在考虑某种树形结构,但我无法想到一种相对容易实现它的方法。
答案 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)
std::vector<std::string>
std::sort()
向量std::mismatch()
查找不匹配的字符,如果所有前缀都匹配,那么您就有匹配您不需要任何特殊的数据结构。会不会很快,可能不如特里快,它是否有效 - 最有可能。它是否有效 - 可能 - 取决于前缀和单词。
答案 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,您可以非常快速地检查前缀。
你的特里会看起来像这样:红色节点是端节点...所以从顶部到红色节点是前缀。
如果你只能使用std的东西,你可以编写一个类节点。在这个类中,你有一个孩子的std :: map。如果你的trie中有超过a和b,那么地图将帮助你快速找到正确的子节点......如果你使用汉字或其他字母......(只有少数元素你应该更好地使用std: :载体)
您还需要一种方法来添加前缀。 之后你只需要一个方法来检查给定的单词是否是一个前缀,方法是通过节点和映射来检查我们是否通过了一个红色节点。
答案 4 :(得分:0)
正如已经提到的,trie是开始看起来的开始,但是有些Radix tree可能是,但是有很多选项,但不幸的是,它们中没有明确的标准。如果你想要快速和实用的东西,我知道{C}描述的this article,但在C ++中很容易实现。