Shortest Common Super-sequence Leetcode(Lcs 문자열과 동일)

10201 단어 javadpalgorithms
두 개의 문자열 str1과 str2가 주어지면 str1과 str2를 모두 하위 시퀀스로 포함하는 가장 짧은 문자열을 반환합니다. 유효한 문자열이 여러 개인 경우 그 중 하나를 반환합니다.

문자열 s는 문자열 t에서 몇 개의 문자(아마도 0)를 삭제하면 문자열 s가 되는 경우 문자열 t의 하위 시퀀스입니다.

예 1:

Input: str1 = "abac", str2 = "cab"
Output: "cabac"
Explanation: 
str1 = "abac" is a subsequence of "cabac" because we can delete the first "c".
str2 = "cab" is a subsequence of "cabac" because we can delete the last "ac".
The answer provided is the shortest such string that satisfies these properties.


해결책:
시간복잡도는 최장공통서열과 동일
즉, O(m*n) , dp 배열을 사용하는 경우 공간 복잡도는 O(m*n) 입니다.

class Solution {
    String str = "";
    public String shortestCommonSupersequence(String str1, String str2) {
        int dp[][] = new int[str1.length()+1][str2.length()+1];

        for(int i=0;i<=str1.length();i++){
            dp[i][0] =0;
        }
        for( int i =0;i<=str2.length();i++){
            dp[0][i] = 0;
        }

        for( int i =1;i<=str1.length();i++){
            for(int j =1;j<=str2.length();j++){
                if(str1.charAt(i-1)==str2.charAt(j-1)){
                    dp[i][j] = 1 + dp[i-1][j-1];
                }
                else dp[i][j] = Integer.max(dp[i][j-1],dp[i-1][j]);
            }
        }
        int p = str1.length(), q = str2.length();

        while(p>0 && q>0){
            if(str1.charAt(p-1) == str2.charAt(q-1)){
                str = str1.charAt(p-1)+ str;
                p--;
                q--;

            }
            else if(dp[p][q-1] > dp[p-1][q]){
                str = str2.charAt(q-1) + str;
                q--;
            }
            else {
                str = str1.charAt(p-1) + str;
                p--;
            }
        }

        while(p>0){
            str  = str1.charAt(p-1)+ str;
            p--;
        }
        while(q>0){
            str = str2.charAt(q-1) +  str;
            q--;
        }
        return str;
    }
}

좋은 웹페이지 즐겨찾기