WHY care? LCS diff tools, version control merges, DNA/protein alignment, aur plagiarism detection ko power karta hai. Yeh canonical 2-D dynamic-programming problem hai.
Maano do strings hain X=x1x2…xm aur Y=y1y2…yn.
Define karo
L(i,j)=length of LCS of the prefixes X[1..i] and Y[1..j].
Hume chahiye L(m,n).
LAST characters xi aur yj ke baare mein socho. Ya toh woh match karte hain ya nahi.
Case 1 — woh match karte hain (xi=yj).
Yeh shared character safely LCS ko end kar sakta hai. Kyun? Kyunki agar in prefixes ka optimal LCS is matching pair ko use nahi karta, toh hum hamesha is pair ko swap in kar sakte hain bina length khoye (neeche steel-manned hai). Toh unhe pair karo aur chote prefixes pe recurse karo:
L(i,j)=1+L(i−1,j−1).
Case 2 — woh match nahi karte (xi=yj).
LCS DONO xi aur yj ko apna final character nahi bana sakta (woh differ karte hain). Toh unme se kam se kam ek endpoint ke roop mein useless hai — ek ko drop karo aur better option lo:
L(i,j)=max(L(i−1,j),L(i,j−1)).
Base case. Ek empty prefix ka koi common subsequence nahi hota:
L(0,j)=L(i,0)=0.
def lcs(X, Y): m, n = len(X), len(Y) L = [[0]*(n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if X[i-1] == Y[j-1]: L[i][j] = 1 + L[i-1][j-1] # match: diagonal + 1 else: L[i][j] = max(L[i-1][j], L[i][j-1]) return L[m][n]
Recall Ek 12-saal ke bachche ko explain karo (Feynman)
Socho do dost hain jinhone apni-apni list banayi un cartoons ki jo unhone order mein dekhe. Tumhe sabse lamba playlist chahiye un cartoons ka jo DONO ne same order mein dekhe hoon — tum cartoons skip kar sakte ho, par unhe reshuffle nahi kar sakte. Tum end se compare karte ho: agar dono lists ka last cartoon same hai, usse rakho aur choti lists dekho. Agar nahi, toh jis list ka last cartoon "worse" hai usse throw away karo aur check karte raho. Sabse bada matching playlist jo tum bana sako woh LCS hai.