2016-11-22 6 views
1

Das Problem, das ich auf mich arbeiten, ist hier: http://practiceit.cs.washington.edu/problem/view/cs2/sections/recursivebacktracking/longestCommonSubsequencelängste gemeinsame Teilfolge java (rekursiv)

im Grunde sind wir zwei Strings gegeben und wir sind die längste gemeinsame Teilfolge zu finden angefordert. Ich habe online nach Lösungen gesucht und diese mit meiner eigenen Lösung verglichen. In meinem Code konnte ich keine Fehler finden. Ich frage mich, warum es immer noch nicht funktioniert.

Und auch, wurde ich gebeten, dieses Problem zu lösen, indem rekursive Methoden

Hier ist mein Code:

public static String longestCommonSubsequence(String a, String b){ 
    if(a.isEmpty() || b.isEmpty()){ 
        return ""; 
    } 
    if (a.substring(a.length() - 1).equals(b.substring(b.length() - 1))){ 
        return longestCommonSubsequence(a.substring(0, a.length() - 1), b.substring(0, b.length() 
         - 1)) + a.substring(a.length() - 1); 
    } else { 
        String first = longestCommonSubsequence(a, b.substring(b.length() - 1)); 
        String second = longestCommonSubsequence(a.substring(a.length() - 1), b); 
        if(first.length() > second.length()){ 
            return first; 
        } 
        return second; 
    } 
} 

Und hier sind die alle Testfälle:

Anruf Rückgabewert

"ABCDEFG", "BGCEHAF" "BCEF"

"sie verkauft", "Muscheln" "sesells"

"12345", "54321 21 54321" "123"

"supercilious Lehrer", "köstlich Pfirsich" "ecious jedes"

" Marty“, "Helene" ""

"", "Joe" ""

"Suzy", "" ""

"ACGGTGTCGTGCTA", "CGTTCGGCTATCGTACGT" "CGGTTCGTGT"

mit meinem Code habe ich StackOverFlow für alle Testfälle.

+0

Es kann funktionieren. Der Vorteil der Verwendung einer DP-basierten Lösung ist die Laufzeit. – iNan

+0

Aber das Ergebnis, das ich bekomme, ist nur eine leere Zeichenfolge. Ich habe versucht, zu debuggen und bemerkte, dass die Zeile 'String first = am längstenCommonSubsequence (a, bstring (1))' weiterläuft und die Buchstaben von String b abschneidet, bis sie leer sind. Und dann wird ein leerer String zurückgegeben. – Amber

+2

Mögliches Duplikat von [Wie kann ich Zeichenketten in Java vergleichen?] (Http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – azurefrog

Antwort

0

Ihre LCS-Berechnung ist nicht korrekt. In LCS müssen Sie vom Ende des Strings vergleichen. Wenn die letzten Zeichen von zwei Strings übereinstimmen, bedeutet dies, dass es Teil Ihres LCS wäre.

public static String longestCommonSubsequence(String a, String b) { 
     int alength = a.length() - 1; 
     int blength = b.length() - 1; 

     if (alength < 0 || blength < 0) 
      return ""; 

     if (a.substring(alength).equals(b.substring(blength))) { 
      return longestCommonSubsequence(a.substring(0, alength), b.substring(0, blength)) 
        + a.substring(alength); 
     } else { 
      String first = longestCommonSubsequence(a, b.substring(0, blength)); 
      String second = longestCommonSubsequence(a.substring(0, alength), b); 
      if (first.length() > second.length()) { 
       return first; 
      } else { 
       return second; 
      } 
     } 
    } 
+0

Danke für Ihre Lösung. Ich habe meinen Code bearbeitet, aber es hat immer noch nicht funktioniert. Anders als dieser Stackflowerror wollte ich fragen, warum das Überprüfen des Anfangs von den Strings nicht funktionieren würde? – Amber

+0

@ Amber sollten Sie keinen Stackoverflow-Fehler im obigen Code erhalten. Können Sie einen Testfall veröffentlichen? Selbst wenn Sie eine Übereinstimmung am Anfang eines Strings finden, gibt es keine Garantie, dass es Teil Ihres LCS wäre. – iNan

+0

Ich habe sie gepostet. Der Fehler erscheint in Zeile 5 und ich konnte mir den Grund nicht vorstellen. – Amber

Verwandte Themen