标签:
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