|
29 | 29 | SC:
|
30 | 30 | - ์ฒซ ๋ฒ์งธ ๋ฌธ์์ด์ ์ i๊ธ์๋ก ๋ง๋ ๋ฌธ์์ด๊ณผ ๋ ๋ฒ์งธ ๋ฌธ์์ด์ ์ j๊ธ์๋ก ๋ง๋ ๋ฌธ์์ด์ lcs์
|
31 | 31 | ๊ธธ์ด๋ฅผ ๊ด๋ฆฌ.
|
32 |
| -- O(m * n) |
| 32 | +- ๊ทธ๋ฐ๋ฐ ์์ด๋์ด์ ์ ์๋ ์ ํ์์ ๋ณด๋ฉด i, j๊ฐ์ ๋ํ ์ ์ฒด ๋ฐฐ์ด์ ์ ์ฅํ ํ์ ์์ด i=k์ผ๋ |
| 33 | + ๊ฐ์ ๊ตฌํ๋ ค ํ๋ค๋ฉด i=k-1์ผ๋ ๊ตฌํ lcs๊ฐ๋ง ์๊ณ ์์ผ๋ฉด ์ถฉ๋ถํ๋ค. |
| 34 | +- ์ฆ, ๋ฐฐ์ด์ ํ์ฌ ๊ตฌํ๊ณ ์ ํ๋ i๊ฐ์ ๋ํ j๊ฐ์ ์์ดํ
๊ณผ ์ง์ ์ ๊ตฌํ j๊ฐ์ ์์ดํ
๋ง ์ ์ฅํ๋ฉด |
| 35 | + ์ถฉ๋ถํ๋ค. ์ฆ, text2์ ๊ธธ์ด์ธ O(n)์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. |
| 36 | +- ๊ทธ๋ฐ๋ฐ ๋ง์ฝ text2์ ๊ธธ์ด๊ฐ text1๋ณด๋ค ๊ธธ๋ฉด ์ด ๋์ ๋ฐ๊ฟ์น๊ธฐํด์ ์์ ๊ณต๊ฐ๋ณต์ก๋๋ฅผ O(m)์ด๋ผ๊ณ |
| 37 | + ๋ด๋ ์์ด๋์ด ์์ฒด๋ ๋๊ฐ์ด ์๋ํ์ง ์๋๊ฐ? |
| 38 | +- ์ฆ, O(min(m, n)) |
33 | 39 |
|
34 | 40 | TC:
|
35 | 41 | - dp ๋ฐฐ์ด์ ์ฑ์ฐ๋ ๋ฐ์ ๋ง์ง๋ง ๋ฌธ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๋จ์ ๋ง์
, ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ ๊ฐ ๋น๊ต. ๋ ๋ค O(1).
|
|
39 | 45 |
|
40 | 46 | class Solution:
|
41 | 47 | def longestCommonSubsequence(self, text1: str, text2: str) -> int:
|
42 |
| - dp = [[0 for _ in range(len(text2) + 1)] for _ in range(len(text1) + 1)] |
| 48 | + if len(text2) > len(text1): |
| 49 | + # ์ด ์ต์ ํ๊น์ง ํด์ฃผ๋ฉด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๊ฐ ๋ง์ด ์ค์ด๋ค ์ ์๋ค. |
| 50 | + text1, text2 = text2, text1 |
| 51 | + |
| 52 | + dp = [[0 for _ in range(len(text2) + 1)] for _ in range(2)] |
43 | 53 |
|
44 | 54 | for i in range(1, len(text1) + 1):
|
| 55 | + i_prev = (i + 1) % 2 |
| 56 | + i_cur = i % 2 |
45 | 57 | for j in range(1, len(text2) + 1):
|
46 |
| - dp[i][j] = ( |
47 |
| - dp[i - 1][j - 1] + 1 |
| 58 | + dp[i_cur][j] = ( |
| 59 | + dp[i_prev][j - 1] + 1 |
48 | 60 | if text1[i - 1] == text2[j - 1]
|
49 |
| - else max(dp[i - 1][j], dp[i][j - 1]) |
| 61 | + else max(dp[i_prev][j], dp[i_cur][j - 1]) |
50 | 62 | )
|
51 | 63 |
|
52 |
| - return dp[-1][-1] |
| 64 | + return dp[i_cur][-1] |
0 commit comments