动态规划--最长公共子串

最长公共子串也是一个动态规划的问题,先求出子问题的解,然后才能求出最优解。

首先我们来看设X = <x1, x2, ..., xm>, Y= <y1, y2, ..., yn>,设C[i][j]为串 X和 Y的最长公共子串长度,则

  • C[i][j]  =  C[i-1][j-1] +1,  X== Yj
  • C[i][j]  =  0,  X!= Yj

申请一个m*n的数组,同时计算出该数组对应位置的数值,找出最大值,则为X 和 Y最长公共子串。

代码如下:

 1 // LCS(SubString).cpp : 定义控制台应用程序的入口点。
 2 //
 3
 4 #include <iostream>
 5 #include <string>
 6 using namespace std;
 7
 8
 9 int LengthOfLongestSubString(const string &X, const string &Y)
10 {
11     // 使元素从下标0开始存储,方便数组访问
12     string strX = " " + X, strY = " " +Y;
13     int m = strX.size(), n = strY.size();
14     int maxLength = 0;
15
16     int **c = new int*[m];
17
18     for (int i = 0; i < m; ++i)
19         c[i] = new int[n];
20     // init the cases that i = 0 and j = 0
21     for (int i = 0; i < m; ++i)
22         c[i][0] = 0;
23     for (int i = 0; i < n; ++i)
24         c[0][i] = 0;
25
26     // Calculate the array C
27     for (int i = 1; i < m; i++)
28         for (int j = 1; j < n; ++j)
29         {
30             if (X[i] == Y[j])
31             {
32                 c[i][j] = c[i - 1][j - 1] + 1;
33                 if (c[i][j] > maxLength)
34                     maxLength = c[i][j];
35             }
36             else
37                 c[i][j] = 0;
38         }
39     // Free the memory
40     for (int i = 0; i < m; ++i)
41         delete c[i];
42     delete []c;
43
44     return maxLength;
45 }
46
47
48 int main(int argc, char** argv)
49 {
50     const string X = "ABCDEFDBEFG";
51     const string Y = "DKGDBCDEFAB";
52
53     int Length = LengthOfLongestSubString(X, Y);
54     cout << "The max Length is :" << Length << endl;
55
56     return 0;
57 }
时间: 2024-11-01 00:16:57

动态规划--最长公共子串的相关文章

动态规划——最长公共子串

引入: 最长公共子序列常用于解决字符串的相似度问题. 最长公共子序列(Longest Common Subsequence,LCS)与最长公共字串(Longest Common Substring):子串是串的一个连续的部分,子序列则是从不改变序列顺序,而从序列中去掉任意多个元素而获得的新的序列:也就是说,子串中字符的位置一定是连续的,而子序列不一定连续. a  not the 之一(得到的未必就是唯一的那个最长公共子串,只有长度是唯一的) --其余字符串问题,待续 解决方案: 1.穷举法(Br

算法作业6 动态规划 - 最长公共子串问题

问题描述:Given 2 sequences, X = x1,...,xm and Y = y1,...,yn, find a common subsequence whose length is maximum. Subsequence need not be consecutive, but must be in order. 程序思路: 使用递归的思路可以解决这个问题.设输入的两个子串为X[0…m - 1]和Y[0…n - 1],L(X[0…m - 1], Y[0…n - 1])为X和Y的

动态规划 &amp; 最长公共子串算法(LCS)

求最长公共子串可以先求最长公共子串的长度,并且记录那些公共子串字符的长度以及字符,然后通过回溯可以找到所有的公共子串. 下面是求最长公共子串长度的动态规划方法. 1:决策,我们在最后一步需要做的决策是,是否要将A[n],B[m]加入公共子串序列中. 2:由 1 可知,若以DP[i][j]表示A[1..i] 与 B[1..j]的最长公共子串的长度,那么可以得到 (1) 若A[i] == B[j]  (即作出决策,将A[i],B[i]都加入公共子串) DP[i][j] = DP[i - 1][j -

[程序员代码面试指南]递归和动态规划-最长公共子串问题

题目描述 给定两个串,输出最长公共子串. 解题思路 维护dp[i][j],表示子串str1[0:i+1]与str2[0:j+1]的最长公共子串长度. 由dp[][]右下角开始,找公共子串. 代码 public class Solution{ private int[][] getDp(char[] str1,char[] str2){ int[][] dp=new int[str1.length][str2.length]; int temp=0; for(int i=0;i<str1.leng

动态规划之最长公共子串

一 问题引入 在生物学中,经常需要比较两个不同生物的DNA,一个DNA串由由一串称为碱基的的分子组成,碱基有鸟嘌呤,腺嘌呤,胞嘧啶,胸腺嘧啶四中,我们用英文字母的首字母表示四种碱基,那么DNA就是在有限集{A,C,G,T}上的一个字符串.例如某种生物的DNA序列为:S1=ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2=GTCGTTCGGAATGCCGTTGCTCTGTAAA,我们比较两个DNA串的原因就是希望确定他们的相似度,作为衡量两个物种相似度的标准.如果一个串是另外一个串

动态规划算法之:最长公共子序列 & 最长公共子串(LCS)

1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab") b a b c 0 0 0 a 0 1

《算法导论》读书笔记之动态规划—最长公共子序列 &amp; 最长公共子串(LCS)

From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题,可以用动态规划来求解.我们采用一个二维矩阵来记录中间的结果.这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是

java 动态规划算法求解最长公共子串

最近在项目中碰到了这样的一个问题,要比较JS和CSS是否做了修改,先是想着借助第三方工具发现没找到,后面转念一想,这个问题不就是对两个文件的第一行求最大的公共子串嘛,既然是要求公共子串的最大长度,由此想到了动态规划算法. 代码是从网上C++改写过来的,感谢那位C++的兄弟,代码如下: package dp; /** * 用动态规划算法求解 最长公共子串 * @author * */ public class LCSSuffix { private static String getLCSLeng

求两个字符串最长公共子串(动态规划)

code如下: //Longest common sequence, dynamic programming method void FindLCS(char *str1, char *str2) { if(str1 == NULL || str2 == NULL) return; int length1 = strlen(str1)+1; int length2 = strlen(str2)+1; int **csLength,**direction;//two arrays to recor