下面选项中t不是s的子序列的是 ( C )
A、s=<{2,4},{3,5,6},{8}> t=<{2},{3,6},{8}>
B、s=<{2,4},{3,5,6},{8}> t=<{2},{8}>
C、s=<{1,2},{3,4}> t=<{1},{2}>
D、s=<{2,4},{2,4}> t=<{2},{4}>
为什么选择C。大神给解释一下!!!谢谢了
关于子序列的问题
答案:2 悬赏:70 手机版
解决时间 2021-02-21 21:33
- 提问者网友:一抹荒凉废墟
- 2021-02-21 04:11
最佳答案
- 五星知识达人网友:执傲
- 2021-02-21 05:09
这里的“子序列”每个集合均为原对应集合的一个子集。现{2}不是{3,4}的子集。
全部回答
- 1楼网友:英雄的欲望
- 2021-02-21 05:55
“abcbdab”和“bdcaba”的最长公共子序列是bcba?不对吧!
如果你想得到abcb,看看下边:
#include
#include
void lcslength(char *x,char *y,int m,int n,int c[][100],int b[][100])
{
puts(x);
puts(y);
int i,j;
for(i=0;i<=m;i++)
c[i][0]=0;
for(j=1;i<=n;j++)
c[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i-1]==y[j-1])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=0;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=1;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=-1;
}
}
}
void printlcs(int b[][100], char *x, int i, int j)
{
if(i==0 || j==0)
return;
if(b[i][j]==0)
{
printf("%c",x[i-1]);//先输出,再递归
printlcs(b,x,i-1,j-1);
//printf("%c",x[i-1]);
}
else if(b[i][j]==1)
printlcs(b,x,i-1,j);
else
printlcs(b,x,i,j-1);
}
void main()
{
char x[100]={"abcbdab"};
char y[100]={"bdcaba"};
int c[100][100];
int b[100][100];
int m,n;
m=strlen(x);
n=strlen(y);
lcslength(x,y,m,n,c,b);
printf("最长子序列为:");
printlcs(b,x,m,n);
printf("\n");
printf("最长子序列长度为:%d\n",c[m][n]);
}
因为你是先递归,再输出,所以输出是从内往外走(递归返回时输出)
如果你改为先输出再递归,这每递归一层就输出一个结果,递归返回时不再输出。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯