1S1 = list(input())
2S2 = list(input())
3
4N1 = len(S1)+1
5N2 = len(S2)+1
6
7dp = [[0]*(N1) for _ in range(N2)]
8
9for i in range(1, N2):
10 for j in range(1, N1):
11 if S2[i-1] == S1[j-1]:
12 dp[i][j] = dp[i-1][j-1] + 1
13 else:
14 dp[i][j] = max(dp[i-1][j], dp[i][j-1])
15i = N2-1
16j = N1-1
17print (dp[i][j])
18if dp[i][j] == 0:
19 exit()
20
21result = ''
22while True:
23 if i==0 or j==0:
24 break
25
26 if dp[i][j] == dp[i-1][j]:
27 i -= 1
28 elif dp[i][j] == dp[i][j-1]:
29 j -= 1
30 else:
31 result = S1[j-1] + result
32 i -= 1
33 j -= 1
34
35print (result)
- 점화식을 잘못 세웠었다
- 문자가 같은 경우에 max(dp[i-1][j], dp[i][j-1])+1이 아닌 dp[i-1][j-1]+1이다.
- LCS 구하는 것을 인터넷에서 참고하였다
- 오른쪽끝에서 시작하여 현재 dp 값이랑 같은 쪽으로 옮긴다
- 현재 dp 값이랑 같은 것이 없으면 문자를 저장하고 대각선 위로 올라간다