LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置。
下面是字符串21232523311324和字符串312123223445的匹配矩阵,前者为X方向的,后者为Y方向的。不难找到,红色部分是最长的匹配子串。通过查找位置我们得到最长的匹配子串为:21232
0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
0 1 0 0 0 0 0 0 0 1 1 0 0 0 0
1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0 0 1 1 0 0 0 0
1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
但是在0和1的矩阵中找最长的1对角线序列又要花去一定的时间。通过改进矩阵的生成方式和设置标记变量,可以省去这部分时间。下面是新的矩阵生成方式:
0 0 0 1 0 0 0 1 1 0 0 1 0 0 0
0 1 0 0 0 0 0 0 0 2 1 0 0 0 0
1 0 2 0 1 0 1 0 0 0 0 0 1 0 0
0 2 0 0 0 0 0 0 0 1 1 0 0 0 0
1 0 3 0 1 0 1 0 0 0 0 0 1 0 0
0 0 0 4 0 0 0 2 1 0 0 1 0 0 0
1 0 1 0 5 0 1 0 0 0 0 0 2 0 0
1 0 1 0 1 0 1 0 0 0 0 0 1 0 0
0 0 0 2 0 0 0 2 1 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
不用多说,你大概已经看出来了。当字符匹配的时候,我们并不是简单的给相应元素赋上1,而是赋上其左上角元素的值加一。我们用两个标记变量来标记矩阵中值最大的元素的位置,在矩阵生成的过程中来判断当前生成的元素的值是不是最大的,据此来改变标记变量的值,那么到矩阵完成的时候,最长匹配子串的位置和长度就已经出来了。
这样做速度比较快,但是花的空间太多。我们注意到在改进的矩阵生成方式当中,每生成一行,前面的那一行就已经没有用了。因此我们只需使用一维数组即可。最终的代码如下:
Private Function LCS(ByVal str_1 As String, ByVal str_2 As String) As String
If str_1 = "" Or str_2 = "" Then Return ""
Dim c(str_1.Length) As Integer
Dim max, maxj, i, j As Integer
maxj = 0 : max = 0 '这两个是标志变量
For i = 0 To str_2.Length - 1
For j = str_1.Length - 1 To 0 Step -1
If str_2.Chars(i) = str_1.Chars(j) Then
If i = 0 Or j = 0 Then
c(j) = 1
Else
c(j) = c(j - 1) + 1
End If
Else
c(j) = 0
End If
If c(j) > max Then '把>改成>=则返回最后一个最长匹配子串
max = c(j) : maxj = j '更新标志变量
End If
Next
Next
If max = 0 Then Return ""
Return str_1.Substring(maxj - max + 1, max) '直接从标志变量得出结果
End Function
分享到:
相关推荐
根据LCS算法取出最长公用字符串,实现字符串比较
最长子序列LCS算法,用于处理最长公共字串问题。 两个序列的LCS问题包含两个序列的前缀的LCS,因此,LCS问题具有最优子结构性质。在设计递归算法时,不难看出递归算法具有子问题重叠的性质。 设C[i,j]C[i,j]...
LCS算法的核心在于找到两个序列在不考虑顺序的情况下,最长的共享子序列。这个子序列并不一定是连续的,但它是两个原始序列中的一个子集。例如,序列"ABCBDAB"和"BDCAB"的LCS是"BCAB"。 C#实现LCS算法通常会采用...
LCS算法旨在找到两个给定序列之间的最长子序列,这个子序列并不需要在原序列中连续出现,但必须保持原有的顺序。 LCS算法的基本思想是采用动态规划来解决。动态规划是一种将复杂问题分解为更小的子问题,并存储这些...
下面我们将深入探讨LCS算法的原理、实现方式以及它的应用。 ### 1. LCS算法定义 给定两个字符串S1和S2,LCS是指存在于S1和S2中的一个子序列,该子序列不是S1或S2的子串,但与两者都相同,且长度最长。例如,对于...
在本项目中,LCS算法被实现为连续问题的解决方案,使用了C++编程语言,旨在提供稳定且高效的性能。** LCS算法的基本思想是通过动态规划来解决。假设我们有两个字符串X和Y,我们要找它们的最长公共子序列。首先,...
LCS算法是一种找出两个序列中最长的相同子序列的算法,它不考虑子序列的顺序,对于字符串而言,就是找到最长的相同子字符串。 首先,我们需要理解LCS算法的基本思想。假设我们有两个字符串S1和S2,LCS算法会找到S1...
本实验报告主要围绕LCS算法进行深入理解和实现,通过分析和设计,旨在让学生掌握动态规划的核心思想。 LCS问题的基本定义是:给定两个序列X和Y,找出它们的最长公共子序列,这个子序列不必连续,但要求字符顺序与原...
【标题】中的“带有 LCS 算法的图像差异工具”指的是使用了 Longest Common Subsequence(最长公共子序列)算法来处理图像差异的工具。LCS 算法是一种在计算机科学中广泛应用于比较序列相似性的算法,不仅在文本编辑...
实现了求最长公共子序列的算法,内容简单易懂,代码也很短
"LCS算法详解.pdf" LCS(Longest Common Subsequence)问题是计算机科学中一个经典的问题,它是指在两个或多个序列中找到最长的公共子序列。这个问题的解决思路有穷举搜索法和动态规划算法两种。 穷举搜索法是最...
《一种节省内存的LCS算法》 在信息技术领域,特别是在数据处理和算法设计中,Longest Common Subsequence(最长公共子序列,简称LCS)是一个经典的计算机科学问题。LCS算法广泛应用于序列比对、生物信息学、文本...
在这里,我们将深入探讨LCS算法的基本原理、实现方式以及其在实际问题中的应用。 LCS算法的核心思想是通过动态规划来解决问题。假设我们有两个序列X和Y,我们需要找到它们的最长公共子序列。一个子序列是从原序列中...
LCS算法的核心在于动态规划。我们可以使用二维数组L[i][j]来存储两个序列X和Y前i个字符与前j个字符的最长公共子序列的长度。基本的递推关系如下: 1. 如果X[i-1] = Y[j-1],则L[i][j] = L[i-1][j-1] + 1,表示在...
最长公共子序列(Longest Common ...通过学习和讨论LCS算法,我们可以深入了解动态规划的运用,提高解决序列比较问题的能力。同时,也可以将其扩展到处理多个序列的LCS问题,例如找到多个序列的最长公共子序列。
LCS算法是一种经典的动态规划问题,其目标是在两个或多个序列中找到最长的相同子序列。这里说的“子序列”是指通过删除原序列中的某些元素(但保持元素顺序不变)得到的序列。LCS问题广泛应用于文本比较、生物信息学...
本文将详细介绍LCS算法及其在C#中的实现,以及如何通过该项目进行文本比较。 LCS算法是一种经典的计算机科学问题,其目标是在两个序列中找到最长的子序列,该子序列同时存在于两个序列中,但并不要求连续。在文本...
lcs 图像差异 带有 LCS 算法的图像差异库和工具
基于GPU的LCS算法加速机制研究与实现.pdf
LCS算法的精髓就是动态规划,序列其实不仅限于字符序列,因此我用模版类对该算法进行了封装,里面提供了尽量方便的函数来进行该算法的使用,该实现并不追求速度最快化,而是尽量让该算法类能支持重用,若发现算法有...