C语言实现最长公共子串与最长公共子序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现最长公共子串与最长公共子序列相关的知识,希望对你有一定的参考价值。

参考技术A 给定两个字符串s1="GeeksforGeeks",s2="GeeksQuizGo",则它们的最长公共子串为“Geeks”,长度为5。

运用动态规划的思想,将两个字符串映射为一张二维表,表格中的值代表到当前为止的最长公共子串的值,如下图所示:

生成这张表的步骤(假设这张表为t[][], r为行标,c为列标):

Code

整个算法的时间复杂度为O(len1 * len2),len1与len2分别为两个字符串的长度。

最长公共子序列与最长公共子串的区别是,最长公共子序列不要求“连续匹配”,它的目的是找到两个字符串中最大的公共部分。依然以s1="GeeksforGeeks",s2="GeeksQuizGo"为例,它们的最长公共子序列为“Geekso”和“GeeksG”,长度为6。

它的二维表如下所示:

它的生成步骤与最长公共子序列的最大不同在第3步,最长公共子序列在遇到s1[r] != s2[c]情况时,不会将t[r][c]重置为0,而是选择Max(t[r-1][c], t[r][c-1])作为新值,即它一直保存着前面已比较序列的最长公共序列值。

最长公共子串

一、最长公共子串和最长公共子序列的区别

最长公共子串:要求子串在原字符串中是连续出现的。   ADE 和ABCDE的最长公共子串是DE

最长公共子序列:不要求子序列在原字符串中是连续的。ADE 和ABCDE的最长公共子序列是ADE

 

二、最长公共子串

字符串1:caba

字符串2:bab

思路:

1.用一个二维数组存储两个字符串的字符是否相等。对角线上连续为1 的最长的序列即为最长公共子串。

2.如何寻找对角线上连续为1的最长序列?

数组中存储的每一元素的取值为:

若匹配成功,值为1加上 该元素的左上元素的取值(即上一行中的左邻元素)

若匹配不成功,取值为0

以上是关于C语言实现最长公共子串与最长公共子序列的主要内容,如果未能解决你的问题,请参考以下文章

最长公共子串与最长公共子序列

最长公共子串与最长公共子序列之间的关系

寻找最长公共子串(高分)

最长公共子串和子序列的Python实现,带图示。

最长公共子串和最长公共子序列

动态规划——最长公共子序列与最长公共子串 (含Python实现代码)