参考:乖乖的函数 动态规划经典例题——最长公共子序列和最长公共子串(python)
1 最长公共子序列
定义:
字符串s=“heqlloled”,字符串p=“eolold!”.
swp[i][j]表示s[0,…i]与p[0,…j]的最长公共子序列长度.
状态转移方程:
(1) 当s[i]==p[j]时,swp[i][j]=swp[i-1][j-1]+1;
(2) 当s[i]!=p[j]时,swp[i][j]=max(swp[i-1][j],swp[i][j-1]);
代码:
char* get_same_equence(char* p1, char* p2)
{
int m = strlen(p1), n = strlen(p2), maxsize = 0,i, j;
vector<vector<int> >swp(m, vector<int>(n));
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (p1[i] == p2[j])
swp[i][j] = ((i > 0 && j > 0) ? swp[i - 1][j - 1] : 0) + 1;
else
swp[i][j] = max(i>0 ? swp[i - 1][j] : 0, j>0 ? swp[i][j - 1] : 0);
}
}
maxsize = swp[m - 1][n - 1];
char *p = new char[maxsize + 1];
//输出最长公共子序列
p[maxsize] = '\0';
for (i = m-1; i >=0; i--)
{
for (j = n - 1; j >= 0; j--)
{
if (swp[i][j] == maxsize&&p1[i] == p2[j])
{
p[--maxsize] = p1[i];
break;
}
}
if (maxsize == 0)
break;
}
return p;
}
输出:
elold
2 最长公共子串
定义:
字符串s=“heqlloled”,字符串p=“eolold!”.
swp[i][j]表示s[0,…i]与p[0,…j]的最长公共子串长度.
状态转移方程:
(1)当s[i]==p[j]时,swp[i][j]=swp[i-1][j-1]+1;
(2)当s[i]!=p[j]时,swp[i][j]=0;
代码:
char* get_same_string(char* p1, char* p2)
{
int m = strlen(p1), n = strlen(p2), maxsize=0, start,i,j;
vector<vector<int> >swp(m, vector<int>(n));
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (p1[i] == p2[j])
swp[i][j] = ((i > 0 && j > 0) ? swp[i - 1][j - 1] : 0) + 1;
else
swp[i][j] = 0;
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (swp[i][j]>maxsize)
{
maxsize = swp[i][j];
start = i-maxsize+1;//获取最大公共子串的起始位置
}
}
}
//输出最大公共子串
char *p = new char[maxsize + 1];
for (i = 0; i < m; i++)
p[i] = p1[start + i];
p[maxsize] = '\0';
return p;
}
输出:
lol