算法分析

先固定字符串str1,取其第一个字符str1[0],(KMP算法)查找str1和str2中有没有以该字符开头的公共子串:即将str[0]与str2中的字符挨个比较,若遇到相等的,再接着比较str1和str2中相等字符的下一个位置,(i++,j++)直至遇到下一对不相等的字符,即完成一个公共子串的搜寻.

将该子串存入串中,之后再依次取出str1中的第2个、第3个…第n个字符,重复上述操作,当str1中的所有字符均取出和str2中的字符遍历比较后,此时所记录下来的公共子串即为所求的最长公共子串。

程序流程图如下:

*name:雷桂艺time:2021年12月8日15:03version:1.0description:1.先固定字符串str1,取其第一个字符str1[0],(KMP算法)查找str1和str2中有没有以该字符开头的公共子串:即将str[0]与str2中的字符挨个比较,若遇到相等的,再接着比较str1和str2中相等字符的下一个位置,(i++,j++)直至遇到下一对不相等的字符,即完成一个公共子串的搜寻.2.将该子串存入串中,之后再依次取出str1中的第2个、第3个…第n个字符,重复上述操作,当str1中的所有字符均取出和str2中的字符遍历比较后,此时所记录下来的公共子串即为所求的最长公共子串。
*/
#include<stdio.h>
#include <string.h>//定义栈来记录下每次找到的公共子串
typedef struct
{int num;char data[100];int len;
}SString;//栈的初始化用来存放公共子串
void Init(SString &s)
{s.num = 0;for (int i = 0; i < 100; ++i){s.data[i] = 0;}
}char s[100] = { 0 };//存放最长公共子串void find(SString s1, char *str1, char *str2)
{for (int i = 0; i<strlen(str1); i++){int k = i, j = 0;//用k记录i,j用于str2中的字符while (j<strlen(str2)){if (str1[k] == str2[j])//相等时,记录数据,并移动k和i{s1.data[(s1.num)++] = str1[k];//将相等的值存入栈中++k;++j;}else{if (strlen(s1.data)>strlen(s))//将新纪录的公共子串与之前子串进行比较,保留最长的//不相等,若已经找到一个公共子串,则判断该公共子串与原有公共子串的长度大小,保留长度较大者{for (int t = 0; t<strlen(s1.data); t++)s[t] = s1.data[t];}if (strlen(s1.data))//如果前面存在公共子串,说明k已经不是str1中取出的第i个字符了,在进行下一次比较前,需将其置为ik = i;else  //否则就一直挨个与str2中的字符进行比较++j;Init(s1);//下一次查找前,对其初始化(清空掉上一次的公共子串信息)}}}
}int main()
{SString s1;Init(s1);char str1[100] ;char str2[100] ;printf("输入串s:\n");gets_s(str1,99);getchar;printf("输入串t:\n");gets_s(str2,99);find(s1, str1, str2);printf("最长子串长度:\n");printf("%d\n", strlen(s));printf("最长子串为:\n");puts(s);return 0;
}

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

  1. 数据结构课程设计---最长公共子串

    数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能: ①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中 ...

  2. 以孩子兄弟链表为存储结构,请设计递归算法求树的高度

    题目:以孩子兄弟链表为存储结构,请设计递归算法求树的高度 分析:如果只有根节点,那么高度为1,如果有左孩子,那么高度由左孩子的左子树和右子树决定,取其大者. 代码如下: typedef struct ...

  3. SPOJ1812(后缀自动机求n个串的最长公共子串)

    题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...

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

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

  5. Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

    Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...

  6. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  7. 动态规划:求最长公共子序列和最长公共子串

    最长公共子序列(LCS): 这同样是一道经典题目,定义就不说了. 为了方便说明,我们用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}.那么,求长度分别为m,n的两个序列X,Y的LCS ...

  8. 求两个字符串的最长公共子串

    给出两个字符串,求出两个字符串的最长公共子串 #include<iostream> #include<string> using namespace std; int main ...

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

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

最新文章

  1. webuploader自己造的坑
  2. html 动态创建表格,jquery动态创建表格
  3. 【软件工程】5.8 黑盒白盒测试
  4. OpenCV中矩阵的归一化*(Normalize函数)
  5. 早期访问中带有NetBeans的Oracle公共云Java服务
  6. AppDelegate.h
  7. Struts2的struts.xml的配置细节
  8. JS 数字,金额用逗号隔开
  9. Idea Java开发必备插件
  10. 4款开源的中文分词系统
  11. 【渗透测试基础-1】渗透测试方法论及渗透测试流程
  12. 微信跳转APP最全解析
  13. 获取json格式中属性—sql
  14. 手把手教你搭建小程序
  15. java读取.doc文件
  16. 客户分级管理的意义和方法?如何高效的对客户进行分级?
  17. Python中range()函数用法
  18. 响应式布局设置--@media only screen and (转载)
  19. 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射
  20. PyTorch 入门实战(五)——2013kaggle比赛 猫狗大战的实现

热门文章

  1. EBC动作片 记录EBC 的 景 和 人
  2. 计算机语言python怎么读,python编程怎么读音发音
  3. android文件打印--printerShare
  4. 深读5G发展的趋势后带给我的感受
  5. Fiddler / Charles - 夜神模拟器证书安装App抓包
  6. 手机通讯录被删除后怎么恢复
  7. Linux的基础指令
  8. 2021年6月27日 root Redmi Note 8
  9. opencvjs 磨皮美颜
  10. 2021年我的读书心得 | 附 TOP 10书单 by 傅一平