数据结构课程设计,由用户输入两个字符串串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"); }

运行结果如下图:

数据结构课程设计---最长公共子串相关推荐

  1. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  2. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)

    动态规划(Dynamic Programming) 练习1:找零钱 找零钱 - 暴力递归 找零钱 - 记忆化搜索 找零钱 - 递推 思考题:输出找零钱的具体方案(具体是用了哪些面值的硬币) 找零钱 - ...

  3. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  4. 采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法。

    算法分析 先固定字符串str1,取其第一个字符str1[0],(KMP算法)查找str1和str2中有没有以该字符开头的公共子串:即将str[0]与str2中的字符挨个比较,若遇到相等的,再接着比较s ...

  5. 助你深刻理解——最长公共子串、最长公共子序列(应该是全网数一数二的比较全面的总结了)

    往事不堪回首,那些年处理过的字符串[的一些骚操作] 最长公共子串篇(20191120) 理论知识: 图形理解: 矩阵初始化: 矩阵数值演变: 类似算法: 代码实现(C++): 代码设计满足的要求: 测 ...

  6. 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)

    目录 1.等值字串 2.KMP匹配 3.大整数相乘 4.最长公共子串 5.判断两个字符串是否匹配 6.最长回文字串 7.年号字串 补发一下,原来忘记发了. 1.等值字串 [问题描述]如果字符串的一个子 ...

  7. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  8. 动态规划套路在最长公共子串、最长公共子序列和01背包问题中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 适合动态规划(DP,dynamic programming)方法的最优化问题有两个要素:最优子结构和重叠子问题. 最优子结构指 ...

  9. 动态规划 dp03 最长公共子串问题 c代码

    题目: 若序列Z是序列X的子序列,又是Y的子序列,则称Z是序列X与Y的公共子序列.例如序列"bcba"是序列"abcbdab"与"bdcaba&quo ...

最新文章

  1. 6-PSCI Power Domain Tree Structure
  2. 用new关键字对一个String 变量赋值和用literal值直接赋值有什么不同(转)
  3. 清华计算机自主招生试题,2017年清华大学自主招生笔试题
  4. pymssql的简单使用
  5. jquery mobile页面跳转后js不执行的问题
  6. ubuntu 10.04解决Skype中麦克风不工作问题
  7. Android POPWindow
  8. MSM8937系统启动流程【转】
  9. 有关初始位置检测,死区补偿,弱磁,MTPA,Foc保护措施,参数辨别的一些文档,和参考代码。
  10. 查看java堆栈信息
  11. 百度地图开放平台web api 获取某项目方圆一公里的poi信息
  12. wz框架登录功能详解——demo1
  13. 阿泰水晶报表补空行(分组)
  14. Urllib2库+正则爬取内涵段子
  15. C++_基础1.1初识——Hellow world
  16. 记:数据库课程设计(一)
  17. 【DP】LeetCode91 解码方法 【java】
  18. Infragistics Ignite UI for Web
  19. Scrapy第十五篇:后起之秀-Playwright
  20. 《CSDN/TUP 系列活动:我们的开源》学习

热门文章

  1. 智能技术可以帮助解决人口老龄化问题吗?
  2. linux脚本日期时间,Linux 日期和时间操作详解
  3. 【枭·音频】感同声受——《暗影火炬城》PS5 HD震动制作
  4. 分享:游戏新手引导程序框架设计3要点
  5. 横版游戏的摄像机移动理论与实践(上)
  6. 用pip命令把python包安装到指定目录
  7. 合肥工业大学宣城校区大学生创新创业训练项目申报书:“基于Spark平台的人工智能知识的知识图谱构建”...
  8. PAT 1079. Total Sales of Supply Chain
  9. 解决 Ubuntu Software (Software Center) Crash 问题
  10. 前后端分离+本地服务实时刷新+缓存管理+接口proxy+静态资源增量更新+各种性能优化+上线运维发布——gulp工作流搭建...