IT笔面试之最长公共子序列
2014-09-02 20:24
127 查看
先介绍LCS问题的性质:记Xm={x0, x1,…xm-1}和Yn={y0,y1,…,yn-1}为两个字符串,而Zk={z0,z1,…zk-1}是它们的LCS,则:
1. 如果xm-1=yn-1,那么zk-1=xm-1=yn-1,并且Zk-1是Xm-1和Yn-1的LCS;
2. 如果xm-1≠yn-1,那么当zk-1≠xm-1时Z是Xm-1和Y的LCS;
3. 如果xm-1≠yn-1,那么当zk-1≠yn-1时Z是Yn-1和X的LCS;
1. 如果xm-1=yn-1,那么zk-1=xm-1=yn-1,并且Zk-1是Xm-1和Yn-1的LCS;
2. 如果xm-1≠yn-1,那么当zk-1≠xm-1时Z是Xm-1和Y的LCS;
3. 如果xm-1≠yn-1,那么当zk-1≠yn-1时Z是Yn-1和X的LCS;
公式:
0
if
i<0 or j<0
c[i,j]= c[i-1,j-1]+1
if
i,j>=0 and xi=xj
max(c[i,j-1],c[i-1,j])
if
i,j>=0 and xi≠xj
注意与最长公共子串的区别:字串是连续的,子序列可不连续。
/article/3446536.html
#include <cstring>
#include <cstdio>
#define M 1010
int LCS(char* str1, char* str2)
{
if(!str1 || !str2)
return 0;
int length_1 = strlen(str1);
int length_2 = strlen(str2);
if(!length_1 || !length_2)
return 0;
int m[length_1+1][length_2+1];
//初始化边界,过滤掉0的情况
for (int i = 0; i <= length_1; i++)
m[i][0] = 0;
for (int j = 0; j <= length_2; j++)
m[0][j] = 0;
//填充矩阵
for (int i = 1; i <= length_1; i++)
{
for (int j = 1; j <= length_2; j++)
{
//相等的情况
if (str1[i - 1] == str2[j - 1])
m[i][j] = m[i - 1][j - 1] + 1;
else
{
//比较“左边”和“上边“,根据其max来填充
if (m[i - 1][j] >= m[i][j - 1])
m[i][j] = m[i - 1][j];
else
m[i][j] = m[i][j - 1];
}
}
}
return m[length_1][length_2];
}
int main()
{
char str1[M],str2[M];
memset(str1,0,sizeof(M));
memset(str2,0,sizeof(M));
printf("请输入字符串str1:");
scanf("%s", str1);
printf("请输入字符串str2:");
scanf("%s", str2);
printf("%d\n",LCS(str1,str2));
return 0;
}
相关文章推荐
- IT职场:程序员Java面试中的陷阱
- 一个IT农民工分享互联网巨头公司面试流程
- IT外企那点儿事(3):奇怪的面试
- IT面试经验——感觉挺好,为啥被拒了?
- IT面试中的一些基础问题
- 包子IT面试培训
- IT面试真经
- IT职场中外企面试最爱提的问题TOP10
- IT名企面试——高薪跳槽面试攻关资料集
- IT主管面试内容
- IT求职经验总结——面试和准备策略
- 华为IT产品线面试总结
- IT名企面试:腾讯笔试题(1)
- 面试IT公司的见闻
- 人人都有好工作:IT行业求职面试必读
- 应届IT研究生面试自我介绍中英文模板
- 程序员面试题—国内知名IT公司面试经历
- 【转】IT名企面试:微软笔试题(2)
- IT企业面试常见逻辑推理题智力题及详解答案(二)
- 整理IT笔试面试资料汇总