2011-01-04 30 views
8

He escrito el siguiente código para LCS. Funciona para muchos casos, pero se rompe para el siguiente. No entiendo dónde se está rompiendo mi código. Por favor ayuda. El código está en C#La subsecuencia más larga común

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

¿Cuál es el resultado deseado, y ¿qué se obtiene ¿en lugar? –

+0

'IndexOutOfRange' es la excepción que obtienes? –

+0

@Dave: el resultado deseado es 13. Recibo 14 – Programmer

Respuesta

9

¿Por qué crees que tu algoritmo está roto? La subsecuencia común más larga es ACCTAGTATTGTTC, que es de 14 caracteres de longitud: (. He modificado su algoritmo para devolver la secuencia en lugar de sólo la longitud)

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

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

+0

Gracias. Sorprendido de ver que las respuestas dadas en las conferencias de Columbia son incorrectas. Mira esto: http://www.columbia.edu/~cs2035/courses/csor4231.F09/lcs.pdf – Programmer

+0

Por cierto, buena idea para devolver la subsecuencia – Programmer

+4

¿dónde podemos encontrar el algoritmo modificado? – Arjang

Cuestiones relacionadas