假设我有:
std::vector<string> group;
std::vector<string> subGroup;
关于这两个载体的一些属性:
1)所有元素都是唯一的。
2)他们没有排序,排序不是一种选择。
我需要检查组是否包含子组。如果确实如此,那么我需要返回true,如果它没有返回false。
示例:
group = {&#34; A&#34;,&#34; B&#34;,&#34; C&#34;,&#34; D&#34;},subGroup = {&#34; A&#34;,&#34; D&#34;,&#34; E&#34;} - &gt; answer = false
group = {&#34; A&#34;,&#34; E&#34;,&#34; C&#34;,&#34; D&#34;},subGroup = {&#34; A&#34;,&#34; D&#34;,&#34; E&#34;} - &gt; answer = true
我目前的实施是:
int cont=0;
if(subGroup.size() > group.size())
return false;
else{
for(int i=0; i<subGroup.size(); i++){
for(int j=0; j<group.size(); j++){
if(subGroup[i] == group[j]{
cont++;
}
}
}
if (cont == subGroup.size())
return true;
return false;
}
我在这里检查了这篇文章locate sub-vector<string> in another vector<string>,但我不应该使用C ++ 11的功能,而且这个答案并没有解决我的问题(例如,使用我的示例2,它将返回假)。
两件事:我的实施是好还是有任何错误?有没有更简单的方法来实现它使用STL功能或类似的东西?
答案 0 :(得分:4)
两个最直接的解决方案是:
set
或unordered_set
,然后检查subgroup
的每个元素,看看它是否在集合中(如果是C + +11是一个选项,您可以使用all_of
和lambda来实现循环)
set
的元素中制作unordered_set
或subgroup
,然后遍历group
的元素,将其从如果存在的话。返回true
如果这会清空集合。在任何一种情况下,要获得合理的最差案例性能保证,如果subgroup
的大小超过group
,则应立即返回false。
后者unordered_set
具有您可能期望的最佳渐近复杂度(即O(n)
其中n
的大小为group
),但我想是第一种选择对于#34;典型的&#34;更有效。实例
答案 1 :(得分:1)
可以使用std::set
std::set<std::string> group ; // Fill it first !
std::vector<std::string> subgroups {"A","D","E"} ;
std::vector<std::string>::iterator i = subgroups.begin() ;
std::pair<std::set<std::string>::iterator,bool> p;
for( ; i != subgroups.end(); ++i )
{
p = group.insert( *i );
if( p.second ) // Present in group
{
break;
}
}
if( i == subgroups.end() )
std::cout << std::boolalpha << true ;
else
std::cout << std::boolalpha << false ;
答案 2 :(得分:1)
使用std:find:
可以解决此问题的简单方法bool in(std::vector<std::string> const &group,
std::vector<std::string> const &subGroup) {
std::size_t const subSize = subGroup.size();
int i = 0;
while (i < subSize && std::find(group.begin(), group.end(), subGroup[i]) != group.end()) {
i++;
}
return (i == subSize);
}