我目前正在嘗試編寫一個函數,它可以幫助我找到二進制字符串之間的相似性。這聽起來很模糊,所以我會用一個例子來解釋。查找二進制字符串中的相似性
StringA : 10111010000
StringB : 10111010011
StringC : 10111101111
我希望我的程序能夠找到出現在相同索引處的任何相似性(4位或更多)。在上面的例子中,我的函數會返回:0-4(因爲字符0到4在所有三個字符串中是相同的)。
我不在尋找代碼,只是這樣做的邏輯和最佳方式。
我目前正在嘗試編寫一個函數,它可以幫助我找到二進制字符串之間的相似性。這聽起來很模糊,所以我會用一個例子來解釋。查找二進制字符串中的相似性
StringA : 10111010000
StringB : 10111010011
StringC : 10111101111
我希望我的程序能夠找到出現在相同索引處的任何相似性(4位或更多)。在上面的例子中,我的函數會返回:0-4(因爲字符0到4在所有三個字符串中是相同的)。
我不在尋找代碼,只是這樣做的邏輯和最佳方式。
字符串是字符數組。
你應該做Loop來比較每個字符。
對於實施例:(I不得不把例如對不起)
for(int i=0;i<=length;i++) \\length = array lenght
{
if(StringA[i]==StringB[i]) CounterA++; \\or something like this
}
方法1:字符串分割成任一個陣列或列表,然後使用LINQ查找列表內的分組.. 。
方法2:遍歷每個字符串,然後在每個字符,然後創建一個字符長度的新字符串,並比較在其他琴絃一樣串...
假設所有三個項目存儲在他們自己的變量中,我會分裂所有的e比特放入數組中。從那裏,我會遍歷一個數組(因爲所有的數組都是相同的大小),並從那裏匹配。此操作將爲O(n)
,因爲您必須查看n
項。
Pseudocode?
陣列:=陣列[號碼]
每個二進制數
每個二進制數如果數字具有在當前索引 陣列相同的二進制位[指數] :=陣列[索引] + 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;
}
絕不是完美的,但應該讓你開始
我想他們分成列表:
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]);
}
}
也許你可以使用位運算符:
例如:
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
如果你只是想是否有最低獲得真或假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比StringA短,它會引發錯誤。我推斷您將要測試的字符串將被預先驗證爲全部相等長度。
如果您不查找代碼,請不要添加語言標籤(如C#或vb.net)。 – nneonneo