- λ λ¬Έμμ΄
text1
,text2
μ κ°μ₯ κΈ΄ κ³΅ν΅ λΆλΆ λ°°μ΄μ κΈΈμ΄λ₯Ό ꡬνλ€.
- λ λ¬Έμμ΄μ λμμ νμνλ©΄μ νΉμ μμΉ
i
,j
μ λ¬Έμλ₯Ό λΆλΆ λ°°μ΄μ ν¬ν¨ μν¨λ€. μ΄ λ μμͺ½μ λ¬Έμμ΄μ΄ κ°μμ§ νμΈνλ€. - λ§μ½ νμ¬ μμΉμ λ¬Έμμ΄μ΄ κ°λ€λ©΄ μμͺ½μ μμΉλ₯Ό λκ°μ΄
1
μ© μ¦κ° μν¨λ€. 곡ν΅λλ λΆλΆ λ°°μ΄μ κΈΈμ΄λ λ§μ°¬κ°μ§λ‘1
μ¦κ°νλ€. - λ§μ½ νμ¬ μμΉμ λ¬Έμμ΄μ΄ κ°μ§ μλ€λ©΄ 첫λ²μ§Έ λ¬Έμμ΄μ μμΉ
i
λλ λλ²μ§Έ λ¬Έμμ΄μ μμΉj
λ₯Ό1
μ¦κ°μν¨λ€. λ κ²½μ° μ€μ λ κΈ΄ κ³΅ν΅ λΆλΆ λ°°μ΄μ κ°μ§ κ²μ μ΅μ’ κ°μΌλ‘ νλ€. - μμͺ½μ λ¬Έμλ₯Ό νμνλ μμΉ
(i, j)
λ³λ‘ κ³΅ν΅ λΆλΆ λ°°μ΄μ μ΅λ κΈΈμ΄λ νμ λμΌνκ² κ³μ°λλ―λ‘ memoizationμ νμ©νλ€.
- μμμ μ€λͺ ν λ°©μμ κ·Έλλ‘ κ΅¬ννλ©΄ μλμ κ°λ€. ν΅κ³Όλ λκΈ°λ νλλ° μ€ν μλκ° λλ¦¬λ€ (61 ms).
class Solution { int traverse(String text1, String text2, int[][] dp, int i, int j) { if (i >= text1.length() || j >= text2.length()) { return 0; } if (dp[i][j] != -1) return dp[i][j]; boolean isSameChar = text1.charAt(i) == text2.charAt(j); return dp[i][j] = Math.max( traverse(text1, text2, dp, i + 1, j + 1) + (isSameChar? 1 : 0), Math.max( traverse(text1, text2, dp, i + 1, j), traverse(text1, text2, dp, i, j + 1) ) ); } public int longestCommonSubsequence(String text1, String text2) { int[][] dp = new int[text1.length()][text2.length()]; for (int[] sub : dp) { Arrays.fill(sub, -1); } return traverse(text1, text2, dp, 0, 0); } }
- κ°μ λ‘μ§μ for loopλ‘ κ΅¬νν μ μλ€.
- νΈμμ memoization λ°°μ΄
dp
μ ν¬κΈ°λ₯Ό 1 λ ν¬κ² μ‘λλ€. - νμ¬ index κ°
(i, j)
μ κΈ°μ€μΌλ‘ μ΄μ μμΉ(i - 1, j - 1)
μ κ°μ λΉκ΅νλ€. - λ§μ½ 0λΆν° μμνλ indexλ₯Ό μ¬μ©νκ² λλ©΄ i, j κ°μ΄ 0λ³΄λ€ ν°μ§ λ§€λ² νμΈν΄μΌ λλ λ²κ±°λ‘μμ΄ μλ€.
- λΉκ΅ν μμͺ½ λ¬Έμκ° λμΌνλ©΄ μμͺ½ λͺ¨λ indexλ₯Ό 1μ© μ¦κ° μν€λ κ²μ΄λ―λ‘ μ΄μ indexμ κ²°κ³Όκ°
dp[i - 1][j - 1]
μ 1μ λν κ²μ΄ νμ¬ indexμ κ²°κ³Όκ°dp[i][j]
μ΄ λλ€. - λΉκ΅ν μμͺ½ λ¬Έμκ° λμΌνμ§ μμΌλ©΄ μ΄λ νμͺ½μ indexλ₯Ό 1 μ¦κ°μν€λ κ²μ΄λ―λ‘ κ°κ°μ μ΄μ indexμ κ²°κ³Όκ°λ€
dp[i - 1][j]
,dp[i][j - 1]
μ€ ν° κ°μ νμ¬ indexμ κ²°κ³Όdp[i][j]
λ‘ νλ€. - μ΅μ’
κ²°κ³Ό κ°μ μμͺ½ λͺ¨λμ λ§μ§λ§ index μμΉμ κ²°κ³Όκ°
dp[m][n]
μΌλ‘ νλ€.
class Solution { public int longestCommonSubsequence(String text1, String text2) { int m = text1.length(), n = text2.length(); int[][] dp = new int[m + 1][n + 1]; for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++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[m][n]; } }
Β