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