最长公共子序列和最长公共字串总结
来源:互联网 发布:dijkstra算法步骤例题 编辑:程序博客网 时间:2024/06/04 19:16
两个问题和相似,又经常在笔试面试中遇到,不如一起总结一下。
1. 最长公共子序列
A = abcdefg
B = acef
则A和B的最长公共子序列为: acef
分析:用dp[i][j] 记录A[1..i]与B[1..j]的最长公共子序列长度,则满足动态规划:
初始化:A[0] = B[i] 则 dp[0][i] = 1 否则 dp[0][i] = 0
A[i] = B[0] 则 dp[i][0] = 1 否则 dp[i][0] = 0
如果 A[i] = B[j] 则dp[i][j] = dp[i-1][j-1] + 1; 否则,dp[i][j] = max{dp[i-1][j],dp[i][j-1]}
int lcseq(const char *A, const char *B){ int lenA = strlen(A); int lenB = strlen(B); int **dp = new int*[lenA]; for(int i = 0; i < lenA; i++) dp[i] = new int[lenB]; for(int i = 0; i < lenA; i++) for(int j = 0; j < lenB; j++) { if(i==0||j==0) dp[i][j] = A[i]==B[j]?1:0; else { if(A[i] == B[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i][j-1],dp[i-1][j]); } } return dp[lenA-1][lenB-1];}
2. 最长公共字串
A = abcdefg
B = abc
公共字串 abc
分析: 用dp[i][j]表示A[1...i]与B[1...j] 的最长公共字串长度
初始条件:dp[0][i] = 1 or 0 dp[i][0] = 1 or 0
如果A[i] = B[j] dp[i][j] = 1 否则 dp[i][j] = 0
int lcsub(const char *A, const char *B){ int lenA = strlen(A); int lenB = strlen(B); int **dp = new int*[lenA]; for(int i = 0; i < lenA; i++) dp[i] = new int[lenB]; for(int i = 0; i < lenA; i++) for(int j = 0; j < lenB; j++) { if(i==0||j==0){ dp[i][j] = A[i]==B[j]?1:0; } else { if(A[i] == B[j]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = 0; } } return dp[lenA-1][lenB-1];}
0 0
- 最长公共子序列和最长公共字串总结
- 最长公共子序列 && 最长公共字串
- 最长公共字串和最长公共子序列
- 最长公共字串与公共子序列
- 动态规划之最长公共子序列和最长公共字串,最大子序列和
- 最长公共字串 最长公共子序列问题
- 最长公共字串与最长公共子序列
- DP---最长公共子序列&最长公共字串
- 最长公共子序列总结
- 最长公共子序列和字串 动态规划
- 公共字串计算(最长公共子串/序列)C++
- 最长公共子串和最长公共子序列
- 最长公共子序列和最长公共子串
- 最长公共子序列和最长公共子串
- 最长公共子串和最长公共子序列
- 最长公共子序列和最长公共子串
- 最长共公共子序列和最长公共子串
- 最长公共子字序列和最长公共子字符串
- 今日开通博客
- 关于产品的一些思考——(四十一)网易之有道云笔记
- java中的对象引用与c++中的对象赋值
- 通过Java向数据库中自增主键(非自增主键)表插入记录的异常
- 自己发现的牛人博客(不断更新)
- 最长公共子序列和最长公共字串总结
- 解决因js误操作cookie后火狐浏览器无法正常显示页面并报js错误
- 使用匿名变量
- Google三驾马车——GFS、MapReduce、Bigtable
- 未命名的变量
- 屌丝黄渤的爆款创业启示
- EmguCV+VS2010 C#,cvinvoke异常的解决办法
- 二元查找树的翻转(镜像)的两种思路
- 关于产品的一些思考——(四十二)网易之有道云笔记协同版