Skip to content

Commit 5d40f2b

Browse files
author
แ„‹แ…ตแ„‹แ…งแ†ซแ„‰แ…ฎ
committed
longest common subsequence
1 parent f2b9477 commit 5d40f2b

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package leetcode_study
2+
3+
/*
4+
* ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ
5+
* ๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ
6+
* ๋ฌธ์ž๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ, table[i][j] = table[i-1][j-1] + 1. ์ฆ‰, ์ด์ „๊นŒ์ง€์˜ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ธธ์ด์— 1์„ ์ถ”๊ฐ€
7+
* ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, table[i][j] = max(table[i-1][j], table[i][j-1]) ์ด๋Š” ํ˜„์žฌ๊นŒ์ง€ ์ฐพ์€ ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ณผ์ •
8+
*
9+
* ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n^2)
10+
* -> ๋‘ ๋ถ„์ž์—ด์„ ์ด์ค‘ ๋ฐ˜๋ณต์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ
11+
* ๊ณต๊ฐ„ ๋ณต์žก๋„: O(nm) (= n๊ณผ m์€ ๊ฐ๊ฐ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ๊ธธ์ด)
12+
* -> dp table์— ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„
13+
* */
14+
fun longestCommonSubsequence(text1: String, text2: String): Int {
15+
val n = text1.length
16+
val m = text2.length
17+
val dp = Array(n + 1) { IntArray(m + 1) }
18+
19+
for (i in 1..n) {
20+
for (j in 1..m) {
21+
if (text1[i - 1] == text2[j - 1]) {
22+
dp[i][j] = dp[i - 1][j - 1] + 1
23+
} else {
24+
dp[i][j] = maxOf(dp[i - 1][j], dp[i][j - 1])
25+
}
26+
}
27+
}
28+
return dp[n][m]
29+
}
30+
31+
/*
32+
* ์ฃผ์–ด์ง„ ๋‘ ๋ฌธ์ž์—ด์— ๊ฐ๊ฐ์˜ Index๋ฅผ ๋‘์–ด ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ํ•ด๊ฒฐ ์‹œ๋„ ํ•ด๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œ๋„
33+
* Test case๋ฅผ ํ†ต๊ณผํ–ˆ์ง€๋งŒ "bac", "abc"์™€ ๊ฐ™์€ case์—์„œ "bc"๋ฅผ ๋‹ต์œผ๋กœ ๋„์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "ac"์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ง€๋‚˜์น˜๊ฒŒ๋จ
34+
* ์ฆ‰, ์ •๋‹ต์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Œ.
35+
* */
36+
fun longestCommonSubsequence(text1: String, text2: String): Int {
37+
var result = 0
38+
var longOne: String
39+
var shortOne: String
40+
var longIndex = 0
41+
var shortIndex = 0
42+
43+
if (text1.length >= text2.length) {
44+
longOne = text1
45+
shortOne = text2
46+
} else {
47+
longOne = text2
48+
shortOne = text1
49+
}
50+
51+
while (shortIndex < shortOne.length) {
52+
if (shortOne[shortIndex] == longOne[longIndex]) {
53+
shortIndex += 1
54+
longIndex += 1
55+
result += 1
56+
} else {
57+
longIndex += 1
58+
}
59+
if (longIndex == longOne.length) break
60+
}
61+
62+
return result
63+
}

0 commit comments

Comments
ย (0)