2013-02-27 3 views
1

가장 긴 공통 부분 순서 알고리즘에 대한 간단한 질문입니다.가장 긴 공통 부분 순서 printdDiff

String input1="ABCDE" 
String input2="ACDC" 
int i=input1.length() 
int j=input2.length() 
: 나는 매개 변수로 사용하는 경우 다음

private static void printDiff(int[][] opt,String x,String y,int i, int j) { 

    if(i>0 &&j>0 && x.charAt(i-1)==y.charAt(j-1)){ 
    printDiff(i-1,j-1); 
    System.out.println(x.charAt(i-1)); 
    } 
    else{ 
     if(j>0&&(i==0||opt[i][j-1]>=opt[i-1][j])){ 
     printDiff(i-1,j-1); 
     System.out.println("-"+y.charAt(j-1)); 
     } 
     else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){ 
     printDiff(i-1,j-1); 
     System.out.println(x.charAt(i-1)); 
     } 
    } 

} 

그리고 :

public int[][] lcsLength(char[] input1, char[] input2) { 
    int[][] opt = new int[M][N]; 
    for (int i = 1; i < input1.length; i++) { 
     for (int j = 1; j < input2.length; j++) { 
      if (input1[i] == input2[j]) { 
       opt[i][j] = opt[i - 1][j - 1] + 1; 
      } else { 
       opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]); 
      } 
     } 
    } 
    return opt; 
} 

을하고 다음과 같은 printDiff 기능 : 난 당신이 다음과 같은 서브 시퀀스를 생성하는 데 필요한 부분을했을

lcsLength()를 사용하여 opt 행렬을 생성 한 후 printdiff woul이 나를 보내 주길 바랍니다.

ABCDE- 
A-CD-C 

대신 내가 얻을 : 내가 잘못 wiki에서 나에게 많은

감사 로랑

+0

디버거 또는 이전 스타일 * 인쇄 디버깅 *을 사용하여 알고리즘을 단계별로 디버깅하려 했습니까? – MrSmith42

+0

아래 편집을 참조하십시오. – Woot4Moo

답변

0

도움이 될 무엇을했는지에

ABCDE- 
ABCD-C 

아이디어 :

function printDiff(C[0..m,0..n], X[1..m], Y[1..n], i, j) 
    if i > 0 and j > 0 and X[i] = Y[j] 
     printDiff(C, X, Y, i-1, j-1) 
     print " " + X[i] 
    else if j > 0 and (i = 0 or C[i,j-1] ≥ C[i-1,j]) 
     printDiff(C, X, Y, i, j-1) 
     print "+ " + Y[j] 
    else if i > 0 and (j = 0 or C[i,j-1] < C[i-1,j]) 
     printDiff(C, X, Y, i-1, j) 
     print "- " + X[i] 
    else 
     print "" 

이 줄 :

else if(i>0&&(j==0|| opt[i][j-1]<=opt[i-1][j])){ 

은 다음과 같아야합니다

else if(i>0&&(j==0|| opt[i][j-1]<opt[i-1][j])){ 

(변경 <= 단지 <)

0
이 관련된 문제의 경우

이 몰라,하지만 난 당신의 LCS 코드가 있어야한다고 생각 :

public int[][] lcsLength(char[] input1, char[] input2) { 
    int[][] opt = new int[input1.length+1][input2.length+1]; 
    for (int i = 1; i <= input1.length; i++) { 
     for (int j = 1; j <= input2.length; j++) { 
      if (input1[i-1] == input2[j-1]) { 
       opt[i][j] = opt[i - 1][j - 1] + 1; 
      } else { 
       opt[i][j] = Math.max(opt[i][j - 1], opt[i - 1][j]); 
      } 
     } 
    } 
    return opt; 
} 
관련 문제