导航:首页 > 编程语言 > java最长公共子序列

java最长公共子序列

发布时间:2022-07-19 22:26:28

1. 帮我讲下题目要求的是什么... (要求解什么)

序列的子序列是将所给序列略去几个元素或者一个不略。给出一个序列X = <x1, x2, ..., xm>,另一个序列 Z = <z1, z2, ..., zk>是X的子序列 如果存在一个序列X的指数的严格递增的子序列<i1, i2, ..., ik> 即对于所有的j = 1,2,...,k, xij = zj。例如,Z = <a, b, f, c>是含指数序列<1, 2, 4, 6>的 X = <a, b, c, f, b, c>的子序列。现给出两个序列X和Y,要求找出X和Y最大长度公共子集。
输入数据来自文本文件。文件中的每个数据都由两个字符串组成来表明所给序列。各个序列由空格隔开。输入数据是正确的。对于每个数据的格式,要求在标准输出端口隔行输出公共子序列的最大长度。
例子输入:
abcfbc abfcab
programming contest
abcd mnp
例子输出:
4
2
0
——————————————————————————————————————
就是要编程找出公共子集的最大长度。。。 赏点分吧。。。 没分从文库下小说了~~~

2. java怎么写求最长的公共子序列

/*目标:输出两个字符串的所有公共最长子序列date:09-11-26BY:zggxjxcgx算法:判断较短串是否为较长串的子序列,如果是则得到结果;否则,对较短串进行逐个字符删除操作(将字符替换为'#'表示删除)。删除操作用递归函数进行实现。每层递归删除一个字符,若删除一个字符后未得到匹配子序列,则还原该字符所在位置。第n层递归未找到匹配子序列,则将递归层数加1,重复删除直到剩下空串。*/#include#includeintdep=0;/*较短串的长度*/intdepflag=0;/*下一步要探测的深度*/intlastflag=0;/*是否找到匹配子序列,1为找到*/intcount=0;/*目标结果的个数*/intmystrcmp(char*s1,char*s2)/*判断s2是否为s1的子串*/{while(*s1*s2)if(*s2=='#')s2++;elseif(*s2==*s1){s1++;s2++;}elses1++;while(*s2=='#')s2++;if(*s2=='\0')return1;return0;}voidpristr(char*str)/*打印最长子序列*/{if(0==count++)printf("\n公共最长子序列:\n");printf("%2d:",count);while(*str){if(*str!='#')printf("%c",*str);str++;}printf("\n");}/*递归函数求最长子序列。start控制下一个要检测的字符,deptemp控制递归的深度,first为's'表示第一层递归*/intfun(char*str1,char*str2,char*start,intdeptemp,charfirst){inti=0,j=0;char*s,cback;do{s=start;if('s'==first)deptemp=depflag;/*在第一层设置递归深度*/while(*s){if(*s=='#'){s++;continue;}cback=*s;*s='#';/*删除当前字符*/if(mystrcmp(str1,str2)){pristr(str2);lastflag=1;}/*找到匹配,将lastflag设为1,在完成深度为deptemp+1的探测(找到所有匹配)后退出递归*/elseif(deptemp>0)fun(str1,str2,s+1,deptemp-1,'n');/*深度探测,s+1表示从下一个位置开始删除*/*s=cback;s++;/*还原该位置的字符,以便下次进行探测*/}if('s'==first)++depflag;/*删除depflag+1个字符还未找到,则递归深度加1*/}while(depflagstrlen(st2))s1=st1,s2=st2;/*将s1设为较长的串*/elses1=st2,s2=st1;printf("\nstr1:%s\nstr2:%s\n",s1,s2);dep=strlen(s2);/*得到较短串的长度*/if(mystrcmp(s1,s2))pristr(s2);elseif(0==fun(s1,s2,s2,0,'s'))printf("\n没有公共元素!\n");//printf("%d\n",mystrcmp("afdebjewcwedw","abcdw#"));}

3. java求最大公共子串

二楼改的
c = b.substring(i,j-1);
之后下标越界没了。

程序无法出结果,中间有死循环。当while语句执行完之后j是a.length();然后是执行内循环for语句for(j=b.length()-1;j>0;j--) 此时只比较J>0;。。。。好像是个死循环。最内层的循环可以在加一个int k来控制。多次运行导致cpu上升至100%的。

提供一种矩阵算法,这是LCS的一种算法:
public class stringCompare {

/**求最长匹配子字符串算法
str数组记录每行生成的最大值strmax
max数组记录str数组最大时所处的列号nummaxj
最大子字符串为substring(nummax-strmax+1,strmax+1)
*/

public static void main(String[] args) {
String s1="asdfgxxcvasdfgc";
String s2="asdfxxcv";
int m=s1.length();
int n=s2.length();
int k=0;
int nummax=0;
int []str=new int[m];
int []max=new int[m];
int []num=new int[m];

for(int i=0;i<m;i++) //生成矩阵数组
for(int j=n-1;j>=0;j--)
{
if(s1.charAt(i)==s2.charAt(j))

if(i==0||j==0)
{
num[j]=1;
max[i]=j;
str[i]=1;
}
else
{
num[j]=num[j-1]+1;
if(max[i]<num[j])
{
max[i]=j;
str[i]=num[j];
}
}
else
num[j]=0;
}

for(k=0;k<m;k++) //求str数组的最大值
{
if(nummax<str[k])
{
nummax=str[k];
}
}

for(k=0;k<m;k++)
if(nummax==str[k])
System.out.println(s2.substring(max[k]-str[k]+1,max[k]+1));
}
}

4. 最长公共子串和最长公共子序列的区别。举个例子不要写代码。

应该是这样:
字符串1:abcde
字符串2:abcdfe
那么:
最长公共子串:abcd
最长公共子序列:abcde
就是公共子串,必须在待匹配字符串中连续,而公共子序列只需要相对顺序匹配就行。
前者一般用KMP算法,后者一般用动态规划解决吧。

5. 最长公共子序列的应用

最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。简而言之,网络知道、网络都用得上。

6. 动态规划求最长公共子序列怎么得到路径

最长公共子串问题:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子串就是求给定两个序列的一个最长公共子序列。

7. 求最长公共子序列(动态规划)

// 求LCS的长度
class LCS
{
public:
LCS(int nx, int ny, char *x, char*y); //创建二维数组c、s和一维数组a、b,并进行初始化
void LCSLength(); //求最优解值(最长公共子序列长度)
void CLCS(); //构造最优解(最长公共子序列)
……
private:
void CLCS(int i, int j);
int **c, **s.m, n;
char *a, *b;
};
int LCS::LCSLength()

{
for(int i=1; i<=m; i++) c[i][0]=0;
for(i=1; i<=n; i++) c[0][i]=0;
for (i=1; i<=m; i++)
for (int j=1; j<=n; j++)
if (x[i]==y[j]){
c[i][j]=c[i-1][j-1]+1; s[i][j]=1; //由c[i-1][j-1]计算c[i][j]
}
else if (c[i-1][j]>=c[i][j-1]){
c[i][j]=c[i-1][j]; s[i][j]=2; //由c[i-1][j]得到c[i][j]
}
else {
c[i][j]=c[i][j-1]; s[i][j]=3; //由c[i][j-1]得到c[i][j]
}
return c[m][n]; //返回最优解值
}

// 构造最长公共子序列
void LCS::CLCS(int i, int j)
{
if (i==0||j==0) return;
if (s[i][j]==1){
CLCS(i-1, j-1);
cout<<a[i];
}
else if (s[i][j]==2) CLCS(i-1, j);
else CLCS(i, j-1);
}

阅读全文

与java最长公共子序列相关的资料

热点内容
androidwidget图片 浏览:833
95压缩比与汽油标号 浏览:752
算法岗位需要学什么专业研究生 浏览:669
银行卡忘了怎么登录手机app 浏览:962
加密双菠萝帽流苏挂件 浏览:885
云服务器后台编程技巧 浏览:997
python人工智能搭建 浏览:250
安卓m6用什么下载 浏览:1000
对程序员有偏见吗 浏览:292
如何让服务器运行缓慢 浏览:238
黑马程序员入学流程 浏览:448
win732位安装python什么版本 浏览:786
压缩方式标准 浏览:558
免费低吸指标源码 浏览:184
MO命令是 浏览:47
python入门常见错误 浏览:411
改加密包名 浏览:785
程序员在线编译器 浏览:247
山东兼职程序员收费标准 浏览:424
物业管理系统项目java源码 浏览:16