박종훈 알고리즘 블로그

(Leetcode) 1143 - Longest Common Subsequence 풀이

기회가 되어 달레님의 스터디에 참여하여 시간이 될 때마다 한문제씩 풀어보고 있다.

https://neetcode.io/practice


https://leetcode.com/problems/longest-common-subsequence

dfs를 통한 풀이

답은 대략 다 맞는것 같은데 Time Limit Exceeded 가 발생된다.

class Solution {
    int longest = 0;

    public int longestCommonSubsequence(String text1, String text2) {
        dfs(text1, text2, 0, 0, 0);
        return longest;
    }

    private void dfs(String text1, String text2, int pointer1, int pointer2, int currentMax) {
        if (pointer1 == text1.length()) {
            return;
        }

        dfs(text1, text2, pointer1 + 1, pointer2, currentMax); // 그냥 다음 문자로 넘김, 선택하지 않는게 베스트 일 수 있음.

        int tempNext = text2.indexOf(text1.charAt(pointer1), pointer2);

        if (tempNext != -1) {
            if (tempNext < pointer2) {
                currentMax = 1;
            } else {
                currentMax++;
                while(pointer1 < text1.length() - 2 && tempNext < text2.length() - 2
                        && text1.charAt(pointer1 + 1) == text2.charAt(tempNext + 1)) {
                    pointer1++;
                    tempNext++;
                    currentMax++;
                }
            }

            longest = Math.max(longest, currentMax);
            dfs(text1, text2, pointer1 + 1, tempNext + 1, currentMax);
        }
    }
}

dp를 통한 풀이

아마도 처음으로 접한 2차원 배열을 사용한 DP 문제가 아닐까 싶다.

dp 로 접근해보니 바로 전에 푼 62번 문제와도 유사해진 것 같다.

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];

        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp[0].length; j++) {
                if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }

        return dp[text1.length()][text2.length()];
    }
}

TC, SC

시간 복잡도는 O(m * n) 공간 복잡도는 O(m * n) 이다.