问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

最长公共子串和最长公共子序列的区别

发布网友 发布时间:2022-04-18 06:11

我来回答

1个回答

热心网友 时间:2022-04-18 07:40

/* 目标:输出两个字符串的所有公共最长子序列
date: 09-11-26
BY: zggxjxcgx
算法: 判断较短串是否为较长串的子序列,如果是则得到结果;
否则,对较短串进行逐个字符删除操作(将字符替换为'#'表示删除)。
删除操作用递归函数进行实现。每层递归删除一个字符,
若删除一个字符后未得到匹配子序列,则还原该字符所在位置。
第n层递归未找到匹配子序列,则将递归层数加1,重复删除直到剩下空串。

*/
#include<stdio.h>
#include<string.h>
int dep=0; /* 较短串的长度 */
int depflag=0; /*下一步要探测的深度 */
int lastflag=0; /* 是否找到匹配子序列,1为找到 */
int count=0; /* 目标结果的个数 */

int mystrcmp(char *s1,char *s2) /* 判断s2是否为 s1的子串 */
{ while(*s1 *s2)
if(*s2=='#') s2++;
else if(*s2 == *s1) { s1++; s2++; }
else s1++;

while(*s2=='#') s2++;
if(*s2=='\0') return 1;
return 0;
}
void pristr(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'表示第一层递归 */
int fun(char *str1,char *str2,char *start,int deptemp,char first)
{ int i=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的探测(找到所有匹配)后退出递归 */
else if(deptemp>0) fun(str1,str2,s+1,deptemp-1,'n'); /* 深度探测,s+1表示从下一个位置开始删除 */
*s=cback; s++; /* 还原该位置的字符,以便下次进行探测 */
}
if('s'==first) ++depflag; /* 删除depflag+1个字符还未找到,则递归深度加1 */
}while(depflag<dep-1 's'==first 0==lastflag); /* 第一层递归具有特殊意义,由三个变量标记是否第一层 */
if(lastflag) return 1; /* lastflag 为1 表示找到匹配子序列 */
return 0;
}
void main()
{ char *s1,*s2;
char st1[]="asfdebjewcwedwk";
char st2[]="sabscdkwss"; // kwfsa
if(strlen(st1)>strlen(st2)) s1=st1,s2=st2; /* 将s1设为较长的串 */
else s1=st2,s2=st1;

printf("\nstr1:%s\nstr2:%s\n",s1,s2);
dep=strlen(s2); /* 得到较短串的长度 */
if(mystrcmp(s1,s2)) pristr(s2);
else if(0==fun(s1,s2,s2,0,'s')) printf("\n没有公共元素!\n");
// printf("%d\n",mystrcmp("afdebjewcwedw","abcdw#"));
}
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
...一个戴耳机 一个拿饭勺 是出自哪部漫画!!!??? 动感新势力47期CD封面上的人物是哪一部动画 帮忙听下这是哪部动画里的插曲! 如何看懂空调参数 RabbitMQ初学者入门 mq语言是什么 二消改造消防规范 申报消防需要些什么图纸啊 在中国农业银行整取整存5万,存二年利息是多少? 五万元存两年农业银行利息是多少给 的是卡还是存款单 微信怎么差聊天记录 怎样查看微信本地聊天记录 新鲜鹿茸怎么处理 新鲜的鹿茸怎么储藏?怎么食用?具体有哪些功能? 多吃什么食物降血糖? 四年级怎样梳头发好看,清纯 如何梳头发简单好看学生图解 html计算器 --这段代码错哪了??? 用HTML代码编写计算器,,使用计算时,,若存在小数点就会出错,,例如78.1... 求一个网站计数器代码,要通用的HTML代码(分数不是问题,在线等)_百度... 帮我写一个网页计算器公式代码 手机WIFI上网是怎么回事?要怎样才能用WIFI上网,详细点 WIFI无线上网怎么用 行尸走肉第五季马丁不是被泰尔西打死了吗 越狱第四季中,男主角最后是怎么死的? 行尸走肉第七季第16集最后谁死了 2012中萨沙是怎么死的? 行尸走肉第七季14集萨沙死了吗 权力的游戏第五季 萨莎史塔克和席恩跳下悬崖,怎么没死的? 《圣斗士星矢冥王神话OVA》后天马,亚伦,萨莎,还有潘多拉的最终结局是什么? - 信息提示 一个女人不肯为你放弃全民k歌是真心爱你吗? 女人非常喜欢与那男的玩全民K歌说明什么 女人非常喜欢与那男的玩全民K歌说明什么 我老婆老是在全民K歌里给那个男人刷礼物 微信,抖音,她俩一直暧昧不清,不知道的还有很多,我该怎么办 一个女的跟自己网上全民K歌恋爱几个月了,都不肯跟自己视频是真的吗? 在全民K歌认识了一个有男朋友的女人 爱发全民K歌到微信朋友圈的女人是什么性格 手机全民k歌里的女性一般是什么人? 老婆在全民K歌里经常和一个异性朋友合唱,该不该留电话和微信联系,还视频,我们婚姻是不是出问题了 小学教师资格证考试科目有哪些? 苹果自带天气预报中,有一种天气是弯弯曲曲的线状的是表示什么意思 西瓜加热了,还是属凉性吗 求解:用C语言,编写程序使N阶方阵转置 元素周期表41号元素念什么 排在元素周期表41序号是第几纵列第几族 元素周期表第二十一到四十一的读音 元素周期表顺序排列加读音 谁能给我元素周期表,谢了! 英语曰记&quot;怎样从错误中学习&quot;范文
  • 焦点

最新推荐

猜你喜欢

热门推荐