如何求最长连续公共子序列和最长连续子字符串
2007-01-28 13:05
225 查看
前段时间研究过如何求最长连续公共子序列和最长连续子字符串,以前一个同学正好问起来,这里贴出来解法:
问题的关键还是如何定义子问题,
假设有:
Xm = x1 x2 x3 ... xm
Yn = y1 y2 y3 ... yn
1. 最长公共子序列(不必连续)
定义f(m, n)为Xm和Yn之间最长的子序列的长度
于是有f(m, 0) = f(0, m) = 0
如果xm != yn, 则f(m, n) = max{ f(m-1, n), f(m, n-1) }
如果xm = yn,则f(m, n) = f(m-1, n-1) + 1
问题归结于求f(m, n)。依照公式用Bottom-up Dynamic Programming可解
2. 最长子字符串(必须是连续的)
定义f(m, n)为Xm和Yn之间最长的子字符串的长度并且该子字符串结束于Xm & Yn。因为要求是连续的,所以定义f的时候多了一个要求字符串结束于Xm & Yn
于是有f(m, 0) = f(0, m) = 0
如果xm != yn, 则f(m, n) = 0
如果xm = yn, 则f(m, n) = f(m-1, n-1) + 1
因为最长字符串不一定结束于Xm / Yn末尾,所以这里必须求得所有可能的f(p, q) | 0 < p < m, 0 < q < n, 最大的f(p, q)就是解。依照公式用Bottom-up Dynamic Programming可解
问题的关键还是如何定义子问题,
假设有:
Xm = x1 x2 x3 ... xm
Yn = y1 y2 y3 ... yn
1. 最长公共子序列(不必连续)
定义f(m, n)为Xm和Yn之间最长的子序列的长度
于是有f(m, 0) = f(0, m) = 0
如果xm != yn, 则f(m, n) = max{ f(m-1, n), f(m, n-1) }
如果xm = yn,则f(m, n) = f(m-1, n-1) + 1
问题归结于求f(m, n)。依照公式用Bottom-up Dynamic Programming可解
2. 最长子字符串(必须是连续的)
定义f(m, n)为Xm和Yn之间最长的子字符串的长度并且该子字符串结束于Xm & Yn。因为要求是连续的,所以定义f的时候多了一个要求字符串结束于Xm & Yn
于是有f(m, 0) = f(0, m) = 0
如果xm != yn, 则f(m, n) = 0
如果xm = yn, 则f(m, n) = f(m-1, n-1) + 1
因为最长字符串不一定结束于Xm / Yn末尾,所以这里必须求得所有可能的f(p, q) | 0 < p < m, 0 < q < n, 最大的f(p, q)就是解。依照公式用Bottom-up Dynamic Programming可解
相关文章推荐
- 如何求最长连续公共子序列和最长连续子字符串
- 如何求最长连续公共子序列和最长连续子字符串
- 求最长连续公共子序列和最长连续子字符串
- 一个看似简单却复杂的问题:求两个字符串的 左向右匹配 所有的 最长连续的 公共子字符串( 在每个字符串中先后次序相同的) 序列
- 经典字符串算法 “最长上升子序列,最大连续子序列和,最长公共子串”
- 求两个字符串的最长的连续公共子串和求两个字符串的公共子序列
- Rust : 求出一个字符串数组中最长的公共连续子序列
- 最长公共子序列和最长公共连续子序列 - andrew的日志 - 网易博客
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 两个字符串的最长连续公共子串
- POJ 3080:Blue Jeans:枚举求解n个字符串的最长公共连续子串
- 最长连续公共子序列
- POJ 3450 Corporate Identity(KMP:最长连续公共子序列)
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- poj3080Blue Jeans(在m个串中找到这m个串的 最长连续公共子序列)
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- “最长上升子序列,最大连续子序列和,最长公共子串”的Java实现
- ALBB 找公共最长连续字母序列的长度
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离