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. UIImage 获取url图片资源

    //UIImage 获取url图片资源 -(UIImage *) getImageFromURL:(NSString *)fileURL { UIImage * result; NSData * da ...

  2. sql 查找死锁对象的存储过程

    USE [master] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 05/12/2016 14:13:46 ...

  3. PHP-MYSQL时间

     Unix 时间戳  Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒数) MySQL: FROM_UNIXTIME() 给定一个Unix 时间戳 (可以是 ...

  4. ajax上传图片到数据库中(不会即时显示)

    一共三个页面 数据表结构 数据表内容 第一个页面 nicheng.html <!DOCTYPE html> <html> <head> <meta chars ...

  5. hdu 5163(前缀和+分类讨论)

    Taking Bus Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. react this.props.form异步执行问题

    最近在做一个选择器联动时,碰到this.props.form的异步执行问题,导致选择器一直没有办法联动 如图,选择公司名称后,应该同步刷新门店选择默认值, 但同时又要清空门店选择的上一次记录 就用到了 ...

  7. Python_Tips[3] -> sort/sorted 排序函数

    排序函数 / Sort Function list自带的sort函数可以实现对列表的排列功能,具有同样功能的还有sorted函数. 基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址 ...

  8. (寒假集训)Roadblock(最短路)

    Roadblock 时间限制: 1 Sec  内存限制: 64 MB提交: 9  解决: 5[提交][状态][讨论版] 题目描述 Every morning, FJ wakes up and walk ...

  9. [POI2015]Kinoman

    题目大意: 给你一个长度为n的数列f,f中共有m种不同的数,每种数都有一个权值w[i]. 你可以选定一个f中的区间,定义区间的权值为这一区间只出现一次的数的权值和. 问权值最大的区间的权值是多少? 思 ...

  10. Asp.net+EF

    EFRepositoryBase using System; using System.Collections.Generic; using System.Data; using System.Dat ...