码迷,mamicode.com
首页 > 其他好文 > 详细

求最长公共子序列长度

时间:2015-04-07 00:40:57      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

poj 1458  Common Subsequence           

http://poj.org/problem?id=1458 

 

问题分析: 

这个题是求两个序列的最长公共最序列长度,在这里要弄清楚两个问题

1:本题中所有的子序列并没有要求是连续子序列,所以在求最长子序列的时候不连续是允许的

2:哪部分子序列才是最长的     

     对于给定的 X = < x1, x2, ..., xm > 和 Z = < z1, z2, ..., zk > ,X序列与Z的每一个子序列都含有公共子序列(最小为0),同理,Z与X的每一个子序列也都有一个公共子序列。用一个数组maxLen[i][j]表示,其中i表示X序列长度,j表示Z序列的长度。 当i  = m && y =  k时,manLen[i][j]为X和Z的最长公共子序列。 

 

代码如下: 

#include <iostream>
#include<string.h>
#include<cstdio>

#define MAX 10000

using namespace std;

int cnt;
string str1;
string str2;
int maxLen[MAX][MAX];

void solve(string x, string y)
{
    int xlen = x.length();
    int ylen = y.length();
    for(int i = 1; i <= xlen; i++) {
        // 初始化x字符串与第二个字符串前0个字符的最长公共子序列为0
        maxLen[i][0] = 0;
        // 初始化y字符串与第一个...
        maxLen[0][i] = 0;
    
}
    for(int i = 1; i <= xlen; i++)
{
        for(int j = 1; j <= ylen; j++){
            //遍历,如果2个字符串的最后一个字符相同,则直接maxLen+1
            if(str1[i-1] == str2[j-1])
                maxLen[i][j] = maxLen[i-1][j-1] + 1;
            else // 最后一个字符不同的时候,取公共字串大的
                maxLen[i][j] = max(maxLen[i][j-1],maxLen[i-1][j]);
        
}
    }
    // 输出x字串和y字串最大公共字串长度
    cout << maxLen[xlen][ylen] << endl;
}
int main()
{
    while (cin >> str1 >> str2) {
        solve(str1,str2);
    
}
    return 0;

} 

求最长公共子序列长度

标签:

原文地址:http://www.cnblogs.com/chunbiao/p/4397226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!