您的位置:首页 > 其它

动态规划之最长连续公共子序列

2014-09-12 15:57 211 查看
#include <IOSTREAM>
#include <CSTRING>
#include <CASSERT>
using namespace std;
//最长连续公共子序列
int MaxLength(const char*str1, const char* str2, int str1_len, int str2_len)
{//对str1[0:str1_len]与str2[0:str2_len-1]处理
int c[100][100] = {0} ;//c[i]j]表示以str1[i-1]和str2[j-1]字符为结尾的子串之间的最长连续公共子串,
//i,j不再表示str1[i]和str2[j],而是表示str1和str2长度的概念,与str1[i-1]和str2[j-1]对应
int maxlen = 0;
int i=0, j=0;
assert(str1 != NULL && str2 != NULL);
for (i=0; i<=str1_len; ++i)
c[i][0] = 0; //c[i][0]表示str2的长度为0的情况;
for (j=0; j<=str2_len; ++j)
c[0][j] = 0; //c[0][j]表示str1的长度为0的情况

for (i=1; i<=str1_len; ++i)
for (j=1; j<=str2_len; ++j)
if (str1[i-1] == str2[j-1])
{
c[i][j] = c[i-1][j-1] + 1;
if (c[i][j] > maxlen)
maxlen = c[i][j];
}
else
{
c[i][j] = 0;
}
return maxlen;
}


//最长连续公共子序列
int MaxLength2(const char*str1, const char* str2, int str1_len, int str2_len)
{//
int c[100][100] = {0} ;//c[i]j]表示以str1[i]和str2[j]字符为结尾的子串之间的最长连续公共子串,
int i =0;
int j = 0;
int maxlen = 0;
assert(str1 != NULL && str2 != NULL);
//处理字符串长度为0的情况
if (str1_len == 0 || str2_len ==0)
return 0;
//必须从0开始,因为c[0][0]==0,会用到
for (i=0; i<=str1_len; ++i)
if (str1[i] == str2[0])
c[i][0] = 1;
else
c[i][0] = 0;
for (j=0; j<=str2_len; ++j)
if (str1[0] == str2[j])
c[0][j] = 1;
else
c[0][j] = 0;

for (i=1; i<str1_len; ++i)
for (j=1; j<str2_len; ++j)
if (str1[i] == str2[j])
{
c[i][j] = c[i-1][j-1] + 1;
if (c[i][j] > maxlen)
maxlen = c[i][j];
}
else
{
c[i][j] = 0;
}
return maxlen;
}


//注意以上两种思想的异同点

int main()
{
char arr[] = "cdab";
char brr[] = "abcd";
cout << MaxLength(arr, brr, strlen(arr), strlen(brr)) << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: