Vb.net 最长公共子字符串大字符串?

Vb.net 最长公共子字符串大字符串?,vb.net,longest-substring,Vb.net,Longest Substring,我需要一些关于这个功能的帮助。我试图在两个字符串之间找到最长的公共字符串。以下是我当前使用的函数: Public Shared Function LCS(str1 As Char(), str2 As Char()) Dim l As Integer(,) = New Integer(str1.Length - 1, str2.Length - 1) {} Dim lcs__1 As Integer = -1 Dim substr As String = String.E

我需要一些关于这个功能的帮助。我试图在两个字符串之间找到最长的公共字符串。以下是我当前使用的函数:

Public Shared Function LCS(str1 As Char(), str2 As Char())
    Dim l As Integer(,) = New Integer(str1.Length - 1, str2.Length - 1) {}
    Dim lcs__1 As Integer = -1
    Dim substr As String = String.Empty
    Dim [end] As Integer = -1

    For i As Integer = 0 To str1.Length - 1
        For j As Integer = 0 To str2.Length - 1
            If str1(i) = str2(j) Then
                If i = 0 OrElse j = 0 Then
                    l(i, j) = 1
                Else
                    l(i, j) = l(i - 1, j - 1) + 1
                End If
                If l(i, j) > lcs__1 Then
                    lcs__1 = l(i, j)
                    [end] = i

                End If
            Else
                l(i, j) = 0
            End If
        Next
    Next

    For i As Integer = [end] - lcs__1 + 1 To [end]
        substr += str1(i)
    Next

    Return substr
End Function

这对多达600字左右的字符串非常有效。如果我尝试比较字数大于该值的字符串,它将开始抛出system.outofmemoryexception。显然,这对记忆的影响很大。是否有任何方法可以微调此函数,或者是否有其他更精简的方法?

我对您的问题很感兴趣,并认为我可能会看看是否可以稍微调整一下,但我只是用6000字的字符串运行了它,效果很好,它甚至只用了一秒钟就完成了,考虑到弦有那么长,这是相当快的。这是内存异常长度的十倍,所以你确定问题不在其他地方吗?因为你的算法看起来很好…谢谢你的关注。我今天要做更多的测试,看看是否还有其他原因。这似乎很零星。有时工作正常,但另一些则会出现内存错误。我不知道这是否是我的想象,但它似乎开始抛出越来越多的记忆错误,我越频繁地使用它。可能是内存泄漏?奇怪。我对你的问题很感兴趣,我想也许我可以看看是否可以稍微调整一下,但我只是用一个6000字的字符串运行了它,它工作得很好,甚至在一秒钟多一点的时间内就完成了,考虑到字符串有那么长,这非常快。这是内存异常长度的十倍,所以你确定问题不在其他地方吗?因为你的算法看起来很好…谢谢你的关注。我今天要做更多的测试,看看是否还有其他原因。这似乎很零星。有时工作正常,但另一些则会出现内存错误。我不知道这是否是我的想象,但它似乎开始抛出越来越多的记忆错误,我越频繁地使用它。可能是内存泄漏?奇怪。