最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cnblogs.com/zhangchaoyang/articles/2012070.html

把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算。

约定:字符串S去掉最后一个字符T后为S‘,T1和T2分别是S1和S2的最后一个字符。

则dist(S1,S2)是下列4个值的最小者:

1.dist(S1‘,S2‘)--当T1==T2

2.1+dist(S1‘,S2)--当T1!=T2,并且删除S1的最后一个字符T1

3.1+dist(S1,S2‘)--当T1!=T2,并且在S1后面增加一个字符T2

4.1+dist(S1‘,S2‘)--当T1!=T2,并且把S1的最的一个字符T1改成T2

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<queue>

using namespace std;
const int maxn=500;
const int inf=0x3f3f3f3f;
const int chart=26;
typedef unsigned long long ll;

int dp[maxn][maxn];
char s1[500],s2[500];
int main(){
    int m,n;
    while(scanf("%s%s",s1,s2)!=EOF){
        n=strlen(s1);m=strlen(s2);
        memset(dp,0x3f,sizeof(dp));
        for(int i = 0;i<=max(m,n);i++) dp[0][i]=dp[i][0]=i;
        for(int i = 1;i<=n;i++)
            for(int j = 1;j<=m;j++){
                if(s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1];
                dp[i][j]=min(dp[i][j],min(dp[i-1][j]+1,dp[i][j-1]+1));
                dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);
            }
        printf("%d\n",dp[n][m]);

    }
    return 0;
}

最长公共子串

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstring>
#include<queue>

using namespace std;
const int maxn=500;
const int inf=0x3f3f3f3f;
const int chart=26;
typedef unsigned long long ll;

int dp[maxn];
char s1[500],s2[500];
int main(){
    int m,n;
    while(scanf("%s%s",s1,s2)!=EOF){
        int ans=0;
        n=strlen(s1);m=strlen(s2);
        memset(dp,0,sizeof(dp));
        for(int i = 1;i<=n;i++)
            for(int j = m;j;j--){
                if(s1[i-1]==s2[j-1]) dp[j]=dp[j-1]+1;
                else dp[j]=0;
                ans=max(ans,dp[j]);
            }
        printf("%d\n",ans);

    }
    return 0;
}
时间: 2024-10-14 00:53:27

最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离的相关文章

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=

最长公共子串+最长公共子序列

两道题都可以用动态规划的方法做,只是状态转移方程不同. 最长公共子串(注意子串是连续的) 1.先建立一个二维数组array[str1.size()][str2.size()](全部初始化为0),初始化第一行和第一列(元素相同处置1),然后进入状态方程 2.状态转移方程: if(str1[i] == str2[i]) array[i][j]=array[i-1][j-1]+1; (左上方对角线的值加上1) 否则无操作. 3.最后寻找整个array中的最大值即可(因为可能有多个子串) 1 /* 2

uva103(最长递增序列,dag上的最长路)

题目的意思是给定k个盒子,每个盒子的维度有n dimension 问最多有多少个盒子能够依次嵌套 但是这个嵌套的规则有点特殊,两个盒子,D = (d1,d2,...dn) ,E = (e1,e2...en) 只要盒子D的任意全排列,小于盒子E,那么就说明 盒子D能放入盒子E中,其实就是将两个盒子的维度排序,如果前一个盒子的维度依次小于后一个盒子,那么就说明前一个盒子能放入后一个盒子中 这个题目能够转化为最长递增子序列. 首先将盒子的维度从小到大排序,然后将k个盒子,按照排序后的第一维度从小到大排

一天一道算法题(5)---最长公共子串

题目 给定两个字符串str1和str2,返回两个字符串的最长公共子串.例如:str1="1AB2345CD",str2="12345EF",公共子串是"2345" 解析 最长公共子串和最长公共子序列的区别是,子串是连续的,子序列是不连续的. 首先还是要生成动态规划表.生成大小为M*N的矩阵dp.dp[i][j]的含义是,在必须把str1[i]和str2[j]当作公共子串最后一个字符的情况下,公共子串最长能有多长.比如,str1="A12

lintcode 中等题:longest common substring 最长公共子串

题目 最长公共子串 给出两个字符串,找到最长公共子串,并返回其长度. 样例 给出A=“ABCD”,B=“CBCE”,返回 2 注意 子串的字符应该连续的出现在原字符串中,这与子序列有所不同. 解题 注意: 子序列:这个序列不是在原字符串中连续的位置,而是有间隔的,如:ABCDE  和AMBMCMDMEM 最长公共子序列是ADCDE 子串:子串一定在原来字符串中连续存在的.如:ABCDEF 和SSSABCDOOOO最长公共子串是ABCD 参考链接,讲解很详细 根据子串定义,暴力破解 public

编辑距离和最长公共子串

编辑距离和最长公共子串问题都是经典的DP问题,首先来看看编辑距离问题: 问题描述 Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.) You have the following 3 operations permitted on a word: a) Insert a

最长递增子序列 &amp;&amp; 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cppblog.com/mysileng/archive/2012/11/30/195841.html 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i]. 这样简单的复杂度为O(n^2),其实还有更好的方

算法设计 - LCS 最长公共子序列&amp;&amp;最长公共子串 &amp;&amp;LIS 最长递增子序列

出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的最长公共子串方法.最长公共子串用动态规划可实现O(n^2)的时间复杂度,O(n^2)的空间复杂度:还可以进一步优化,用后缀数组的方法优化成线性时间O(nlogn):空间也可以用其他方法优化成线性.3.LIS(最长递增序列)DP方法可实现O(n^2)的时间复杂度,进一步优化最佳可达到O(nlogn)

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

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