Let's say we have two strings:

str1 = 'ACDEB'

str2 = 'AEBC'

We need to find the longest common subsequence, which in this case should be 'AEB'.

Using dynamic programming, we want to compare by char not by whole words.

  • we need memo to keep tracking the result which have already been calculated

    •   memo is 2d array, in this case is 5 * 4 array.
  • It devided problem into two parts
    •   If the char at the given indexs for both strings are the same, for example, 'A' for str1 & str2, then we consider
'A' + LSC(str1, str2, i1 + 1, i2 + 1)
    • If the char at the given indexs are not the same, we pick max length between LCB('DEB', 'EBC') & LCB('CDEB', 'BC'),  we pick
Max {
LCS('DEB', 'EBC'),
LCS('CDEB', 'BC')
}

Bacislly for the str1 = 'CDEB' str2 = 'EBC', the first char is not the same, one is 'C', another is 'E', then we devide into tow cases and get the longer one. The way to devide is cutting 'C' from str1 get LCS('DEB', 'EBC'), and cutting 'E' from str2 get LCS('CDEB', 'BC').

 /**
* FIND THE LONGEST COMMON SEQUENCES BY USING DYNAMICE PROGRAMMING
*
* @params:
* str1: string
* str2: string
* i1: number
* i2: number
* memo: array []
*
* TC: O(L*M) << O(2^(L*M))
*/ function LCS(str1, str2) {
const memo = [...Array(str1.length)].map(e => Array(str2.length)); /**
* @return longest common sequence string
*/
function helper(str1, str2, i1, i2, memo) {
console.log(`str1, str2, ${i1}, ${i2}`);
// if the input string is empty
if (str1.length === i1 || str2.length === i2) {
return "";
}
// check the memo, whether it contians the value
if (memo[i1][i2] !== undefined) {
return memo[i1][i2];
}
// if the first latter is the same
// "A" + LCS(CDEB, EBC)
if (str1[i1] === str2[i2]) {
memo[i1][i2] = str1[i1] + helper(str1, str2, i1 + 1, i2 + 1, memo);
return memo[i1][i2];
} // Max { "C" + LCS(DEB, EBC), "E" + LCB(CDEB, BC) }
let result;
const resultA = helper(str1, str2, i1 + 1, i2, memo); // L
const resultB = helper(str1, str2, i1, i2 + 1, memo); // M if (resultA.length > resultB.length) {
result = resultA;
} else {
result = resultB;
} memo[i1][i2] = result;
return result;
} return {
result: helper(str1, str2, 0, 0, memo),
memo
};
} //const str1 = "I am current working in Finland @Nordea",
//str2 = "I am currently working in Finland at Nordea"; const str1 = "ACDEB",
str2 = "GAEBC"; const { result, memo } = LCS(str1, str2);
console.log(
`
${str1}
${str2}
's longest common sequence is
"${result === "" ? "Empty!!!" : result}"
`
); console.log(memo);

----

Bottom up solution can be:

1. Init first row and first col value to zero

2. Then loop thought the data, If row latter and col latter is not the same, then take which is larger Max {the previous row same col value data[row-1][col], same row but previous col data[row][col-1]}

3. If they are the same, take data[row-1][col-1] + 1.

Source, Code

[Algorithms] Using Dynamic Programming to Solve longest common subsequence problem的更多相关文章

  1. Dynamic Programming | Set 4 (Longest Common Subsequence)

    首先来看什么是最长公共子序列:给定两个序列,找到两个序列中均存在的最长公共子序列的长度.子序列需要以相关的顺序呈现,但不必连续.例如,"abc", "abg", ...

  2. Dynamic Programming | Set 3 (Longest Increasing Subsequence)

    在 Dynamic Programming | Set 1 (Overlapping Subproblems Property) 和 Dynamic Programming | Set 2 (Opti ...

  3. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  4. [Algorithms] Longest Common Subsequence

    The Longest Common Subsequence (LCS) problem is as follows: Given two sequences s and t, find the le ...

  5. 1143. Longest Common Subsequence

    link to problem Description: Given two strings text1 and text2, return the length of their longest c ...

  6. 2017-5-14 湘潭市赛 Longest Common Subsequence 想法题

    Longest Common Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Longest Common Subs ...

  7. 最长公共字串算法, 文本比较算法, longest common subsequence(LCS) algorithm

    ''' merge two configure files, basic file is aFile insert the added content of bFile compare to aFil ...

  8. 【牛客网】Longest Common Subsequence

    [牛客网]Longest Common Subsequence 发现只有d数组最格路 于是我们把前三个数组中相同的数记成一个三维坐标,同一个数坐标不会超过8个 从前往后枚举d,每次最多只会更新不超过8 ...

  9. LintCode Longest Common Subsequence

    原题链接在这里:http://www.lintcode.com/en/problem/longest-common-subsequence/ 题目: Given two strings, find t ...

随机推荐

  1. 0-1背包问题(经典)HDU2602 Bone Collector

    Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. 《R语言实战》读书笔记--第三章 图形初阶(一)

    3.1使用图形 可以使用pdf等函数将图形直接保存在文件中.在运用attach和detach函数的使用中经常出现错误,比如命名重复的问题,所以,应该尽量避免使用这两个函数. plot是一般的画图函数, ...

  3. vs2008升级正式版

    1.VS2008简体中文正式版序列号 1.Visual Studio 2008 Professional Edition: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT 2.Visual ...

  4. Installing patches on an ESXi 5.x by the command

    Purpose This article outlines the procedure for installing patches on an ESXi 5.x host from the comm ...

  5. WPF - 样式 (转)

    本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的 ...

  6. WireShark:TCP三次握手 抓包

    本机ip:192.168.201.200 服务器ip:192.168.230.20 抓到的数据如下: 第一次握手: SYN标记位为1,表示这是一个连接请求.seq 用于服务端返回确认信息,此时ack ...

  7. mysql创建用户后无法登陆

    创建用户后登陆失败的原因是存在匿名用户: root@controller:~# mysql -h localhost -uaa -ppassword ERROR 1045 (28000): Acces ...

  8. 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】

    转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcal ...

  9. (十二)C语言双指针的常见用法

    1.用作函数的返回值,比较常见的是返回分配的堆内存地址. 下面用一个例子进行说明下: /******************************************************** ...

  10. 【推荐】nodeJS后台守护进程-forever

    A simple CLI tool for ensuring that a given node script runs continuously (i.e. forever) 本地执行: npm i ...