2011-01-04 14 views
8

Napisałem poniższy kod dla LCS. Działa na wiele przypadków, ale zrywa dla tego poniżej. Nie rozumiem, gdzie łamie się mój kod. Proszę pomóż. Kod jest w języku C#Najdłuższa wspólna podsekwencja

namespace LongestCommonSubsequenceBF 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

     string B = "AAACCGTGAGTTATTCGTTCTAGAA"; 
     string A = "CACCCCTAAGGTACCTTTGGTTC"; 
     //find LCS in A,B starting from index 0 of each 
     int longestCommonSubsequence = LCS(A, B, 0, 0); 
     Console.WriteLine(longestCommonSubsequence); 
     Console.Read(); 

    } 

    //Find the longest common subsequnce starting from index1 in A and index2 in B 
    //Pass A as shorter string 
    public static int LCS(String A, String B, int index1, int index2) 
    { 
     int max = 0; 
     if (index1 == A.Length) 
     { 
      //You have reached beyond A and thus no subsequence 
      return 0; 
     } 
     if (index2 == B.Length) 
     { //you may reach end of 2nd string. LCS from that end is 0 
      return 0; 
     } 

     for (int i = index1; i < A.Length ; i++) 
     { 
      int exist = B.IndexOf(A[i],index2); 
      if (exist != -1) 
      { 
      // found = true; 

       int temp = 1 + LCS(A, B, i + 1, exist + 1); 
       if (max < temp) 
       { 
        max = temp; 
       } 


      } 


     } 
     return max; 

    } 
    } 
} 
+2

Jaki jest pożądany efekt, i co masz zamiast? –

+0

'IndexOutOfRange' jest wyjątkiem, który otrzymujesz? –

+0

@Dave: pożądany wynik to 13. Otrzymuję 14 – Programmer

Odpowiedz

9

Dlaczego Twój algorytm jest uszkodzony? Najdłuższy wspólny podciąg jest ACCTAGTATTGTTC, który ma 14 znaków: (. I zmodyfikowany algorytm, aby powrócić sekwencję zamiast tylko długości)

string B = "AAACCGTGAGTTATTCGTTCTAGAA"; 
       ^^^^^^ ^^^^ ^^^^ 

string A = "CACCCCTAAGGTACCTTTGGTTC"; 
      ^^^^^^ ^^ ^^^^^^ 

+0

Dzięki. Zaskoczony, że odpowiedzi udzielone w wykładach w Kolumbii są błędne. Sprawdź to: http://www.columbia.edu/~cs2035/courses/csor4231.F09/lcs.pdf – Programmer

+0

Przy okazji, fajny pomysł, aby zwrócić podsekwencję – Programmer

+4

, gdzie możemy znaleźć zmodyfikowany algorytm? – Arjang

Powiązane problemy