用C语言求解最长公共子串问题【超详细】【附原代码】

本文详细介绍了如何使用C语言通过动态规划算法解决寻找两个字符串的最长公共子串问题。从问题描述、输入输出形式到题目解析,再到核心思路、初始化、计算过程和代码实现,步步深入,帮助读者理解解题方法。
摘要由CSDN通过智能技术生成

【问题描述】输入俩个字符串,求解存在于这俩个字符串序列中的最长公共子串并输出

【输入形式】1:A,B,C,A,D,B,B;

                     2:B,C,E,D,B,B
【输出形式】D,B,B

【题目解析】这里所说的公共子串,要求在俩个原序列中连续,这也是与之前公共子序列问题相区别的最大点。就如例题中给出的输出形式我们可以发现,公共子串无论在原序列1或是原序列2中都是连续的。处理时最容易想到的便是暴力求解,依次遍历序列1与2去比较。并对每次的结果进行比较,保留长度最大的公共子串。这种思想容易想到,但空间时间复杂度较高,对资源开销巨大。通过分析我们容易发现,最长公共子串为4时,一定存在公共子串长度为3,2,1的子串 。例如:最长公共子串为D,B,B;其长度为3,存在公共子串:D,B;其长度为2,同理存在B;D等长度为1的子串;可以看出最长子串包含前一长度下的最优子结构,并且存在重叠子问题(即在前一长度串的基础下求出本次最佳串),那么我们便容易想到此问题仍然可以采取动态规划的思路解决此问题来降低开销。


【核心思路】这里我们仍然通过定义二维数组,记录俩个字符数组中元素每次遍历比较的结果来求解。同样是自底向上的分析处理,并且通过设置追踪变量来找到最大公共子串元素。具体实现如下:

一、定义:为了方便处理问题,这里我们做如下定义:

               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会C语言呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值