数据结构课程设计---最长公共子串
数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能:
①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中的位置并记录,如果Z既不是X的子串也不是Y的子串,则显示不匹配。
②找出X和Y的一个最长公共子串。
③置换: 用户输入任意的字符串去置换X和Y中的子串Z。
思想:首先使用Kmp算法进行匹配,快速定位子串在主串中的匹配位置。使用动态规划的思想,求出最长公共子串,然后使用跟子串一样长度的新字符串来替换主串中的字串。
完整的代码如下:
#include "stdio.h" #include "string.h" #include "stdlib.h" const int n=200; int c[n][n]; char str[n]; #define MaxSize 100 typedef struct { char data[MaxSize]; int length; //串长 }SqString; void StrAssign(SqString &str,char cstr[]) //str为引用型参数 { int i; for (i=0;cstr[i]!='/0';i++) str.data[i]=cstr[i]; str.data[i]='/0'; str.length=i; } void GetNextval(SqString t,int nextval[]) //由模式串t求出nextval值 { int j=0,k=-1; nextval[0]=-1; while(j<t.length) { if (k==-1 || t.data[j]==t.data[k]) { j++; k++; if(t.data[j]!=t.data[k]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } } int KMPIndex1(SqString s,SqString t,int start) //修正的KMP算法,start为每次匹配的起始位置 { int nextval[MaxSize],i=0,j=0; GetNextval(t,nextval); i=start; while(i<s.length && j<t.length) { if(j==-1 || s.data[i]==t.data[j]) { i=i+1; j++; } else j=nextval[j]; } if (j>=t.length) return (i-t.length); else return -1; } int lcs_len(char a[],char b[],int c[][n]) { int sa=strlen(a); int sb=strlen(b); int i,j; for(i=0;i<=sa;i++) c[i][0]=0; for(j=0;j<=sb;j++) c[0][j]=0; for(i=1;i<=sa;i++) { for(j=1;j<=sb;j++) { if(a[i-1]==b[j-1]) c[i][j]=c[i-1][j-1]+1; else if(c[i][j-1]> c[i-1][j]) c[i][j]=c[i][j-1]; else c[i][j]=c[i-1][j]; } } return c[sa][sb]; } char* bulid_lcs(char a[],char b[]) { int k=0,i,j; i=strlen(a); j=strlen(b); k=lcs_len(a,b,c); str[k]= '/0 '; while(k>0) { if(c[i][j]==c[i-1][j]) i--; else if(c[i][j]==c[i][j-1]) j--; else { str[--k]=a[i-1]; i--; j--; } } return str; } void main() { char a[n],b[n],z[n],f[n],change[n]; SqString s,t,st; int p[n],q[n],m,i=1,j,j1,j2,k,h,start,flag1,flag2; printf("Please enter three strings!/n"); printf("Please enter first string X: "); gets(a); printf("Please enter second string Y: "); gets(b); printf("Please the new string Z: "); gets(z); StrAssign(s,a); StrAssign(t,b); StrAssign(st,z); start = 0,j1=0; flag1=flag2=-1; while(1) //求子串Z在主串X中的所有位置,并记录 { if(start>=s.length) break; m=KMPIndex1(s,st,start); if(m!=-1) { flag1=1; printf("字符串Z在字符串X中第%d次匹配的位置为:%d/n",i++,m); p[j1++]=m; start = m+st.length; } else break; } start = 0,j2=0,i=1; while(1) //求子串Z在主串Y中的所有位置,并记录 { if(start>=t.length) break; m=KMPIndex1(t,st,start); if(m!=-1) { flag2=1; printf("字符串Z在字符串Y中第%d次匹配的位置为:%d/n",i++,m); q[j2++]=m; start = m+st.length; } else break; } if(flag1==-1 && flag2==-1) printf("无法匹配!/n"); //不匹配的时候 bulid_lcs(a,b); if(str[0]==' ') printf("这两个字符串没有公共字符串!/n"); else { printf("The max length common subsequence is: "); puts(str); //找出X和Y的一个最长公共子串 } if(flag1==1 || flag2==1) { printf("请输入任意的串去置换X和Y中的子串Z:/n"); gets(change); if(flag1==1) //替换X中的字串Z { printf("X中的子串Z被%s替换后为:",change); h=k=0; for(i=0;i<j1;i++) { for(;k<p[i];k++) f[h++]=a[k]; for(j=0;j<strlen(change);j++) f[h++]=change[j]; k+=st.length; } for(;k<s.length;k++) f[h++]=a[k]; f[h]='/0'; strcpy(a,f); puts(a); } if(flag2==1) //替换Y中的字串Z { printf("Y中的子串Z被%s替换后为:",change); h=k=0; for(i=0;i<j2;i++) { for(;k<q[i];k++) f[h++]=b[k]; for(j=0;j<strlen(change);j++) f[h++]=change[j]; k+=st.length; } for(;k<t.length;k++) f[h++]=b[k]; f[h]='/0'; strcpy(b,f); puts(b); } } system("pause"); }
运行结果如下图:
数据结构课程设计---最长公共子串相关推荐
- 常考数据结构与算法:最长公共子串
题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...
- 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...
- 采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法。
算法分析 先固定字符串str1,取其第一个字符str1[0],(KMP算法)查找str1和str2中有没有以该字符开头的公共子串:即将str[0]与str2中的字符挨个比较,若遇到相等的,再接着比较s ...
- 助你深刻理解——最长公共子串、最长公共子序列(应该是全网数一数二的比较全面的总结了)
往事不堪回首,那些年处理过的字符串[的一些骚操作] 最长公共子串篇(20191120) 理论知识: 图形理解: 矩阵初始化: 矩阵数值演变: 类似算法: 代码实现(C++): 代码设计满足的要求: 测 ...
- 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)
目录 1.等值字串 2.KMP匹配 3.大整数相乘 4.最长公共子串 5.判断两个字符串是否匹配 6.最长回文字串 7.年号字串 补发一下,原来忘记发了. 1.等值字串 [问题描述]如果字符串的一个子 ...
- java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现
关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...
- 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用
2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...
- 动态规划 dp03 最长公共子串问题 c代码
题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...
最新文章
- 6-PSCI Power Domain Tree Structure
- 用new关键字对一个String 变量赋值和用literal值直接赋值有什么不同(转)
- 清华计算机自主招生试题,2017年清华大学自主招生笔试题
- pymssql的简单使用
- jquery mobile页面跳转后js不执行的问题
- ubuntu 10.04解决Skype中麦克风不工作问题
- Android POPWindow
- MSM8937系统启动流程【转】
- 有关初始位置检测,死区补偿,弱磁,MTPA,Foc保护措施,参数辨别的一些文档,和参考代码。
- 查看java堆栈信息
- 百度地图开放平台web api 获取某项目方圆一公里的poi信息
- wz框架登录功能详解——demo1
- 阿泰水晶报表补空行(分组)
- Urllib2库+正则爬取内涵段子
- C++_基础1.1初识——Hellow world
- 记:数据库课程设计(一)
- 【DP】LeetCode91 解码方法 【java】
- Infragistics Ignite UI for Web
- Scrapy第十五篇:后起之秀-Playwright
- 《CSDN/TUP 系列活动:我们的开源》学习
热门文章
- 智能技术可以帮助解决人口老龄化问题吗?
- linux脚本日期时间,Linux 日期和时间操作详解
- 【枭·音频】感同声受——《暗影火炬城》PS5 HD震动制作
- 分享:游戏新手引导程序框架设计3要点
- 横版游戏的摄像机移动理论与实践(上)
- 用pip命令把python包安装到指定目录
- 合肥工业大学宣城校区大学生创新创业训练项目申报书:“基于Spark平台的人工智能知识的知识图谱构建”...
- PAT 1079. Total Sales of Supply Chain
- 解决 Ubuntu Software (Software Center) Crash 问题
- 前后端分离+本地服务实时刷新+缓存管理+接口proxy+静态资源增量更新+各种性能优化+上线运维发布——gulp工作流搭建...