본문 바로가기
Algorithm

[DP] LCS

by orioncsy 2022. 11. 1.

Longest Common Subsequence(최장 공통 부분 문자열)

public int LCS(String str1, String str2) {
    int M=str1.length();
    int N=str2.length();
    int[][] dp=new int[M+1][N+1];
    for(int i=1; i<=M; i++){
      for(int j=1; j<=N;j++){
        if(str1.charAt(i-1)==str2.charAt(j-1)) dp[i][j]=dp[i-1][j-1]+1;
        else dp[i][j]=Math.max(dp[i][j-1], dp[i-1][j]);
      }
    }
    return dp[M][N];
}
  • 2차원 배열을 dp로 선언한다.(행은 문자열1의 길이+1, 열은 문자열2의 길이+1)
  • 이중 for문으로 M과 N을 돈다.
  • 점화식
    • if(str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1 (dp는 1부터 배정해야하기 때문에 str1, str2는 인덱스에 -1을 한다.)
    • else dp[i][j]=max(dp[i][j-1], dp[i-1][j]) (각 스트링의 문자를 하나 뺐을 때의 값 중 최대값을 넣는다.)

'Algorithm' 카테고리의 다른 글

[DP]LIS  (0) 2022.11.01
[Two Point]uglyNumbers  (0) 2022.11.01
Rest API  (0) 2022.10.20
LSCS  (0) 2022.10.18
Binary Search  (0) 2022.10.13