【发布时间】:2019-01-09 12:29:05
【问题描述】:
问题:
假设我有一个前缀列表:
[p1, p2, p3, ... pn] //Prefix List (strings)
我想知道字符串 'target' 是否有任何上述前缀。
朴素的解决方案示例:
bool contains_prefix(std::string target, vector<std::string> &prefixes)
{
for (const auto& prefix : prefixes)
{
if (target.compare(0, prefix.length(), prefix)
return true;
}
return false;
}
std::vector<std::string> prefixes{"car" , "auto" , "biscuits"};
bool test = contains_prefix("automobile", prefixes); //returns true
test = contains_prefix("biscu", prefixes); //returns false
test = contains_prefix("v", prefixes); //returns false (obviously)
因此,这种简单的解决方案有一个明显的缺陷,即它必须遍历列表中的每一项。
有没有更快的方法来实现这种类型的前缀匹配?
我试过了:
1. 我尝试创建一个与 std::set 一起使用的比较对象,但集合需要严格的弱排序(通过 a>b 和 a'
2.我可以使用正则表达式来实现,但这并不能解决必须遍历每个元素的问题。
3.任何散列的数据结构都不适用于基于模式的匹配。
【问题讨论】:
-
试试trie?
标签: c++ regex string stl substring