计算二进制模式的子集

时间:2010-03-29 19:41:45

标签: c++ algorithm

我有一组A =字符串和一个B =单独的字符串。我想计算A中B的出现次数。

示例:

A:
10001
10011
11000
10010
10101

B:
10001

result would be 3.(10001 is a subset of 10001,10011,10101)

所以我需要一个带有set和string的函数并返回一个int。

int myfunc(set<string> , string){
int result;
// My Brain is melting
return result ;
}

编辑  00000不应该是任何东西的子集!

4 个答案:

答案 0 :(得分:2)

您可以将这些字符串转换为整数并按位进行,并对掩码执行:

if ((input & mask) == mask) {
    /* matches */
}

答案 1 :(得分:2)

您可以使用二进制and函数:

if( ( pattern & listItem[i] ) == pattern )
{
  // match
}

pattern和listItem [i]都必须是数值数据类型才能应用and

答案 2 :(得分:2)

如果您可以控制输入,并且这些字符串确实应该代表位掩码,那么您可能希望将它们保留为某种类型的整数,并按照其他人的建议使用位掩码。否则,如果您坚持将它们作为字符串处理,并且您将使用相同的字符串集进行多次搜索,那么您最好将它们转换为完整的位掩码。

但是,如果只处理一组字符串,那么最好只浏览一下并手动检查每一次。随便,像这样:

int myfunc(set<string> in, string search){
    assert(search.length() <= 32);
    int result = 0;
    for(set<string>::iterator iIn = in.begin(); iIn != in.end(); ++iIn)
    {
       bool isSubset = true;
       if (iIn->length() != search.length()) // Is this guaranteed?
           isSubset = false;
       for (int iSearch = 0; isSubset && iSearch < search.length; ++iSearch)
           if (search[iSearch] == '1' && (*iIn)[iSearch] == '0')
               isSubset = false;
       if (isSubset)
           ++result;
    }
    return result;
}

或者转换为长第一版:

int myfunc(set<string> in, string search){
    int result = 0;
    long searchInteger = strtol(search.c_str(), NULL, 2);
    for(set<string>::iterator iIn = in.begin(); iIn != in.end(); ++iIn)
        if ((strtol(iIn->c_str(), NULL, 2) & searchInteger) == searchInteger)
            ++result;
    return result;
}

答案 3 :(得分:1)

我们可以假设字符串的长度都相同,只包含字符0和1吗?

好的,是的,那么如果你能找到一个将二进制字符串转换为整数的函数,那么就像其他人建议使用'和'操作一样。

否则可能性如下:

int count = 0;
for (k=0; k<sizeofA; k++) {
  for (j=0; j<lengthOfString; j++)
      if ( ('1'==B[j]) && ('1' != A[k][j])) break;
  if (j==lengthOfString) count++;
}