2014-04-30 2 views
0

현재 이진 문자열 간의 유사성을 찾는 데 도움이되는 함수를 작성하려고합니다. 이것은 모호하게 들리므로 예제로 설명하겠습니다.이진 문자열에서 유사점 찾기

StringA : 10111010000 
StringB : 10111010011 
StringC : 10111101111 

내 프로그램이 동일한 색인에서 발생하는 유사점 (4 자리 이상)을 찾을 수 있기를 바랍니다. 위의 예제에서 my 함수는 0-4를 반환합니다 (caracters 0에서 4까지가 세 문자열 모두에서 동일하므로).

코드를 찾는 것이 아니라 논리적이고 최적의 방법입니다.

+1

코드를 찾고 있지 않다면 C# 또는 vb.net과 같은 언어 태그를 추가하지 마십시오. – nneonneo

답변

1

문자열은 Char의 배열입니다.

각 문자를 비교할 루프를 수행해야합니다. 예를 들어

는 : 다음 목록 내에서 그룹을 찾기 위해 LINQ를 사용, 배열, 또는 목록 중 하나에 문자열을 분할 .. :

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

방법 1 (미안 예를 넣어했다) .

방법 2 : 각 문자열을 통해 루프는 다음

0

세 가지 항목은 가정 ... 각 문자를 통해, 다음 문자 길이의 새 문자열을 만들고, 다른 문자열에 같은 문자열 비교 자신의 각각의 변수에 저장, 나는 모든 th e 비트를 배열로 변환합니다. 거기에서, 나는 모든 배열이 같은 크기이기 때문에 하나의 배열을 반복하고 거기에서 일치합니다. n 항목을보아야하므로이 작업은 O(n)이됩니다.

0

의사 코드?

배열 = 배열 ​​[숫자 각각 이진수 번호는 현재 인덱스 어레이에서 동일한 이진 디지트 [인덱스]이있는 경우 각 이진수
위한

= 배열 ​​[인덱스] + 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; 
} 
없음으로

완벽한 의미하지만

을 시작할 수 있어야
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]); 
    } 
} 
0

은 아마 당신이 비트 연산자를 사용할 수 있습니다

  1. 가에서 XOR 결과를 얻을 수/B (말 : A^B)와 A/C (말 : A^C)
  2. 단계 1의 결과가 아님 : ~ (A^B); ~ (A^C)
  3. 얻는 단계 (2)로부터 결과 (~ (A^B)) & (~ (A^C))
  4. 단계 3.

에서 1 부를 얻을 예:

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 
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보다 짧은 경우 오류가 발생합니다. 테스트 할 문자열이 모두 동일하다고 미리 추정됩니다. 길이.