C# 查找二进制字符串中的相似性

C# 查找二进制字符串中的相似性,c#,vb.net,string,binary,compare,C#,Vb.net,String,Binary,Compare,我目前正试图编写一个函数,帮助我找到二进制字符串之间的相似之处。这听起来很模糊,所以我将用一个例子来解释 StringA : 10111010000 StringB : 10111010011 StringC : 10111101111 我希望我的程序能够找到同一索引中出现的任何相似之处(4位或更多)。在上面的示例中,我的函数将返回:0-4(因为字符0到4在所有三个字符串中都是相同的) 我不是在寻找代码,只是寻找一种合乎逻辑的最佳方法。字符串是字符数组 您应该执行一个循环,在该循环中比较每个

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

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


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

字符串是字符数组

您应该执行一个循环,在该循环中比较每个字符

例如:(我不得不举个例子,对不起)


for(int i=0;i方法1:将字符串拆分为数组或列表,然后使用LINQ查找列表中的分组


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

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

伪代码

数组:=数组[数字]

对于每个二进制数
对于每个二进制数 如果数字在当前索引中具有相同的二进制数字 数组[索引]:=数组[索引]+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;
}
private static int GetDifferences(字符串firstStr、字符串secondStr)
{
int-val=0;
char[]first=firstStr.ToCharArray();
char[]second=secondStr.ToCharArray();
for(int i=0;i

绝非十全十美,但应该让你开始

我将它们分成一个列表:

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]);
   }
}
static void Main()
{
var a=“10111010000”;
var b=“10111010011”;
var c=“10111101111”;
var aList=Split(a,4);//使用自定义拆分方法
var bList=分割(b,4);
var-cList=分割(c,4);
Dictionary hits=新字典();
对于(int i=0;i
可能您可以使用位运算符:

  • 从A/B(例如:A^B)和A/C(例如:A^C)获取异或结果
  • 不获取步骤1的结果:~(A^B);~(A^C)
  • 从步骤2获取并得到结果:(~(A^B))&(~(A^C))
  • 从步骤3中获取1个零件
  • e、 g:

    一,

    二,

    三,


    如果您只是想知道是否至少有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
    
    如果要检索匹配的数组索引,则需要向相同的过程添加逻辑,以将每个匹配索引添加到整数数组,并从函数返回该数组,如下所示

    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
    
    如果没有匹配的索引,函数将不返回任何内容


    函数仅测试StringA的长度,因此如果StringB或StringC短于字符串A,则会引发错误。我推断,您将测试的字符串将预先验证为长度相等。

    如果您不查找代码,请不要添加语言标记(如C#或vb.net)。
        ~(A^B)=~(00000000011)=11111111100;
        ~(A^C)=~(00000111111)=11111000000;
    
        (~(A^B))&(~(A^C)) =11111111100&
                           11111000000
                          =11111000000
    
    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
    
    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