求两个数组的最长公共子串长度(LCS)
来源:互联网 发布:李明linux 编辑:程序博客网 时间:2024/06/11 02:55
求两个数组的最长公共子串长度(LCS)
样例
输入:
5 5
1 3 2 0 3
1 0 2 3 3
输出:
3
求两个数组的最长公共子串长度(LCS),思路其实很简单,
两个数组s[i],t[i]。f[i][j]表示s[1~i]和t[1~j]的LCS,
然后如果s[i]==t[j]那么这一位可以加进LCS,即if(s[i]==s[j]){f[i][j]=f[i-1][j-1]+1};
如果不等于f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]);
初始化 :
for(i=0; i<=lens; i++)
f[i][0]=0;
for(j=0; j<=lent; j++)
f[0][j]=0;
最后输出结果f[lens][lent];
不多说了,附代码:
#include<bits/stdc++.h>using namespace std;int f[10001][10001];int s[10001],t[10001];int MAX(int x,int y){if(x>y) return x;return y;}int main(){int lens,lent,i,j;scanf("%d%d",&lens,&lent);for(i=1; i<=lens; i++)scanf("%d",&s[i]);for(j=1; j<=lent; j++)scanf("%d",&t[j]);for(i=0; i<=lens; i++)f[i][0]=0;for(j=0; j<=lent; j++)f[0][j]=0;for(i=1; i<=lens; i++){for(j=1; j<=lent; j++){if(s[i]==t[j]){f[i][j]=f[i-1][j-1]+1;}else{f[i][j]=MAX(f[i-1][j],MAX(f[i][j-1],f[i-1][j-1]));}}}printf("%d\n",f[lens][lent]);return 0;}
输出最长公共子串以后再讲,有兴趣的朋友可以自己写写。
0 0
- 求两个数组的最长公共子串长度(LCS)
- 求两个字符串的最长公共子串(LCS)
- 求两个字符串的最长公共子串(LCS)
- 求两个字符串的最长公共子串(LCS)
- 求两个字符串最长公共子串LCS(其它)
- 求两个字符串的最长公共子串的长度
- 求两个字符串的最长公共子串的长度
- 求两个字符串中的最长公共子串的长度
- 求两个字符串公共子串的最长长度
- 求两个字符串最长公共子串的长度
- 求两个字符串最长公共子串(LCS问题)
- 求两个字符串最长公共子串LCS
- 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。C实现
- LCS算法实现 求两个字符串中间最长的公共子串
- LCS两个字符串最长公共子串
- LCS算法求最长公共子串
- LCS算法求最长公共子串
- LCS求最长公共子串
- JSON工具(org.json)
- JavaScript字符集编码与解码_1
- Elasticsearch mappings小结
- [CQOI2006] 简单题 - 线段树/树状数组
- driveddate的清除路径
- 求两个数组的最长公共子串长度(LCS)
- 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包导致的此版本的应用程序不支持其项目类型(.vcproj)的解决办法
- 2.输入5个数(含负数、小数)将它们按由小到大的顺序排列起来
- 使用迅雷下载百度云盘大文件方法
- Discuz 门户列表页自动获取内容图片
- recyclerView多条目展示,ArgbEvaluator颜色渐变
- String、StringBuffer与StringBuilder之间区别
- LEETCODE--Longest Palindrome
- 1048. Find Coins (25)