위와 같은 어레이를 만들어서 가장 끝에 위치한 값이 답이 될것이다.
예를들어, dp[2][3]이 의미하는 것은 "ac"와 "ab"의 LCS이다.
위 테이블에서 dp[2][3]=1 이 나오는 이유는 a 하나만 공통이기 때문이다.
인덱스 실수를 하지않기 위함이다.
t1 = "#"+t1;
t2 = "#"+t2;
같은경우: "ac", "abc"
다른경우: "ac", "ab"
이렇게 dp테이블을 모두 채우면 time O(N^2), space O(N^2)에 수행할 수 있다.
var longestCommonSubsequence = function(t1, t2) {
if(t1===t2) return t1.length;
t1 = "#"+t1;
t2 = "#"+t2;
const dp=[...Array(t1.length)].map(row => Array(t2.length).fill(0));
for(let i=1; i<t1.length; i++){
for(let j=1; j<t2.length; j++){
if(t1[i]===t2[j]){
dp[i][j] = 1 + dp[i-1][j-1];
}else{
dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]);
}
}
}
return dp[t1.length-1][t2.length-1];
};
Discuss에서 본 마음따뜻한 댓글 ㅠ
space 최적화를 하셨던데.. 일단 머리아파서 안보긴했는데.. 언젠간 보고싶다.. ^-^..