采用顺序结构存储串,设计实现求串S和串T的一个最长公共子串的算法。
算法分析
先固定字符串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的一个最长公共子串的算法。相关推荐
- 数据结构课程设计---最长公共子串
数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能: ①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中 ...
- 以孩子兄弟链表为存储结构,请设计递归算法求树的高度
题目:以孩子兄弟链表为存储结构,请设计递归算法求树的高度 分析:如果只有根节点,那么高度为1,如果有左孩子,那么高度由左孩子的左子树和右子树决定,取其大者. 代码如下: typedef struct ...
- SPOJ1812(后缀自动机求n个串的最长公共子串)
题目:http://www.spoj.com/problems/LCS2/ 题意:给定n个串,求它们的最长公共子串. 思路就是:先将一个串建SAM,然后用后面的串去匹配,对于每一个串,保存最大值,对于 ...
- 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)
目录 1.等值字串 2.KMP匹配 3.大整数相乘 4.最长公共子串 5.判断两个字符串是否匹配 6.最长回文字串 7.年号字串 补发一下,原来忘记发了. 1.等值字串 [问题描述]如果字符串的一个子 ...
- Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离
Algorithm:C++/python语言实现之求旋转数组最小值.求零子数组.求最长公共子序列和最长公共子串.求LCS与字符串编辑距离 目录 一.求旋转数组最小值 1.分析问题 2.解决思路 二.求 ...
- 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...
动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...
- 动态规划:求最长公共子序列和最长公共子串
最长公共子序列(LCS): 这同样是一道经典题目,定义就不说了. 为了方便说明,我们用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}.那么,求长度分别为m,n的两个序列X,Y的LCS ...
- 求两个字符串的最长公共子串
给出两个字符串,求出两个字符串的最长公共子串 #include<iostream> #include<string> using namespace std; int main ...
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...
最新文章
- webuploader自己造的坑
- html 动态创建表格,jquery动态创建表格
- 【软件工程】5.8 黑盒白盒测试
- OpenCV中矩阵的归一化*(Normalize函数)
- 早期访问中带有NetBeans的Oracle公共云Java服务
- AppDelegate.h
- Struts2的struts.xml的配置细节
- JS 数字,金额用逗号隔开
- Idea Java开发必备插件
- 4款开源的中文分词系统
- 【渗透测试基础-1】渗透测试方法论及渗透测试流程
- 微信跳转APP最全解析
- 获取json格式中属性—sql
- 手把手教你搭建小程序
- java读取.doc文件
- 客户分级管理的意义和方法?如何高效的对客户进行分级?
- Python中range()函数用法
- 响应式布局设置--@media only screen and (转载)
- 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射
- PyTorch 入门实战(五)——2013kaggle比赛 猫狗大战的实现