ให้สตริง s1, s2 หาความยาว Longest Common Subsequence (LCS) — "Special Subsequence" หมายถึง Subsequence (ลบตัวอักษรได้ 0 ตัวขึ้นไป)
ตัวอย่าง: s1='pineapple', s2='people' → 5 (LCS = "peple")
ขั้นตอน (DP Space Optimized O(min(m,n)))
- ใช้ 2 Dictionary
prevและcur(Default 0) - วน
iทุกตัวอักษรในs1:- วน
jทุกตัวอักษรในs2:cur[j] = prev[j-1]+1 if s1[i]==s2[j] else max(cur[j-1], prev[j])
prev = cur
- วน
prev[len(s2)-1]ตัวอย่างโค้ด
from collections import defaultdict
def solve(s1, s2):
prev = defaultdict(int)
for i in range(len(s1)):
cur = defaultdict(int)
for j in range(len(s2)):
cur[j] = prev[j-1] + 1 if s1[i] == s2[j] else max(cur[j-1], prev[j])
prev = cur
return prev[len(s2)-1]
s1 = 'pineapple'
s2 = 'people'
print(solve(s1, s2)) # Output: 5อินพุต
'pineapple', 'people'
เอาต์พุต
5