在二进制字符串中查找相似之处

时间:2014-04-30 15:53:22

标签: c# vb.net string binary compare

我目前正在尝试编写一个可以帮助我找到二进制字符串之间相似性的函数。这听起来很模糊,所以我将用一个例子来解释。

StringA : 10111010000
StringB : 10111010011
StringC : 10111101111 

我希望我的程序能够找到在同一索引处发生的任何相似之处(4位或更多)。在上面的例子中,我的函数将返回:0-4(因为caracters 0到4在所有三个字符串中都是相同的)。

我不是在寻找代码,只是一种合乎逻辑且最佳的方式。

8 个答案:

答案 0 :(得分:1)

String是Char的数组。

你应该使用循环来比较每个字符。

例如:(我必须举例,对不起)

for(int i=0;i<=length;i++) \\length = array lenght
{
    if(StringA[i]==StringB[i]) CounterA++; \\or something like this
}

答案 1 :(得分:1)

迭代字符串中的每个字符,如果匹配则添加到计数器:

private static int GetDifferences(string firstStr, string secondStr)
{
    int val = 0;

    char[] first = firstStr.ToCharArray();
    char[] second = secondStr.ToCharArray();

    for (int i = 0; i < first.Length; i++)
    {
        if (first[i] == second[i])
        {
            val++;
        }
    }

    return val;
}

绝不是完美的,但应该让你开始

答案 2 :(得分:0)

方法1:将字符串拆分为数组或列表,然后使用LINQ查找列表中的分组...

方法2:循环遍历每个字符串,然后遍历每个字符,然后创建一个具有字符长度的新字符串,并与其他字符串上的相同子字符串进行比较......

答案 3 :(得分:0)

假设所有三个项都存储在各自的变量中,我会将所有位分成一个数组。从那里,我将迭代一个数组(因为所有数组都是相同的大小)并从那里匹配。此操作为O(n),因为您必须查看n项。

答案 4 :(得分:0)

伪代码?

array:= array [numbers]

表示每个二进制数
 对于每个二进制数   如果数字在当前索引处具有相同的二进制数字    array [index]:= array [index] + 1   结束  结束 端

答案 5 :(得分:0)

我将它们分成一个列表:

static void Main()
{
    var a = "10111010000";
    var b = "10111010011";
    var c = "10111101111";

   var aList = Split(a, 4); //Use a custom split method
   var bList = Split(b, 4);
   var cList = Split(c, 4);

   Dictionary<int,string> hits = new Dictionary<int, string>();

   for (int i = 0; i < aList.Count(); i++)
   {
       if(aList[i] == bList[i] && bList[i] == cList[i])
           hits.Add(i,aList[i]);
   }
}

答案 6 :(得分:0)

可能你可以使用Bitwise运算符:

  1. 从A / B获得XOR结果(比如:A ^ B)和A / C(比如说:A ^ C)
  2. 得不到步骤1的结果:〜(A ^ B); 〜(A ^ C)
  3. 得到第2步的结果:(〜(A ^ B))&amp;(〜(A ^ C))
  4. 从第3步获得1部分。
  5. e.g:

    1

          A^B=10111010000^
              10111010011
             =00000000011;
          A^C=10111010000^
              10111101111
             =00000111111
    

    2

        ~(A^B)=~(00000000011)=11111111100;
        ~(A^C)=~(00000111111)=11111000000;
    

    3

        (~(A^B))&(~(A^C)) =11111111100&
                           11111000000
                          =11111000000
    

答案 7 :(得分:0)

如果您只想获得关于是否存在至少4个匹配字符的真或假,您可以这样做:

Public Function StringsHaveMin4CharsInCommon(ByVal StringA As String, ByVal StringB As String, ByVal StringC As String) As Boolean
Dim bReturn As Boolean
Dim iCounter As Integer

For i As Integer  = 0 To StringA.Length - 1

If StringA.SubString(i, 1) = StringB.SubString(i, 1) And StringB.SubString(i, 1) = StringC.SubString(i, 1) Then iCounter += 1

    If iCounter = 4 Then 
        bReturn = True
        Exit For
    End If 

Next i

Return bReturn

End Function

如果要检索匹配的数组索引,则需要在同一过程中添加逻辑,以将每个匹配的索引添加到Integer数组,并从函数返回该数组,如下所示。

Public Function GetCommonIndices(ByVal StringA As String, ByVal StringB As String, ByVal StringC As String) As Integer()
Dim iReturn() As Integer
Dim iCounter As Integer = -1

For i As Integer  = 0 To StringA.Length - 1

    If StringA.SubString(i, 1) = StringB.SubString(i, 1) And StringB.SubString(i, 1) = StringC.SubString(i, 1) Then 

        iCounter += 1
        ReDim Preserve iReturn(iCounter)
        iReturn(iCounter) = i

    End If 

Next i

Return iReturn

End Function

如果没有匹配的索引,函数将返回Nothing。

这些函数只测试StringA的长度,因此如果StringB或StringC比String A短,它将抛出一个错误。我推断你将要测试的字符串将被预先验证为全长相等。