You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rust、Python、JavaScript实现两字符串所有公共子串查找

问题背景

Git是一款非常优秀的版本控制系统,我希望通过编写自研版本控制系统来学习Git,第一步需要实现字符串diff工具。我已经阅读了相关博客和论文。要计算两个字符串的差异,我需要先定位二者的公共部分,因此遇到了这个问题:如何查找两个字符串的所有公共子串?

这是我问题的第一部分:算法问题。
我目前使用的算法如下:

算法问题

【问题】查找string1和string2的所有公共子串。
【解决方案】

  • 枚举string1的所有子串与string2比对,将匹配结果收集到答案中。
  • 枚举string2的所有子串与string1比对,将匹配结果收集到答案中。

该算法的时间复杂度为O(N²)。

编程语言实现问题

为了验证我的思路,我已经用Python轻松实现了该算法:

def commonSubstringFinder(string1, string2):
    answer=[]
    len1, len2 = len(string1), len(string2)
    match = ""
    x,y = 0,0
    for i in range(len2):
        for j in range(len1):
            if ( i+j < len2) and (string1[j] == string2[i+j]):
                if len(match)==0:
                    x,y=i+j,j
                match += string1[j]
            else:
                if len(match)>0:
                    answer.append(((x,y), match))
                    match=""
    
    for i in range(1,len1):
        for j in range(len2):
            if (i+j<len1 and string1[i+j] == string2[j] ):
                if len(match)==0:
                    x,y=j,i+j
                match += string2[j]
            else:
                if len(match)>0:
                    answer.append(((x,y), match))
                    match=""
                
    return answer

print(commonSubstringFinder("apkleses", "appleses"))
print(commonSubstringFinder("cappleses", "caplekses"))

# [((0, 0), 'ap'), ((3, 3), 'leses'), ((2, 1), 'p'), ((6, 4), 'es'), ((4, 6), 'es')]
# [((0, 0), 'cap'), ((6, 6), 'ses'), ((7, 5), 'es'), ((2, 3), 'ple'), ((6, 8), 's'), ((4, 7), 'e')]

但是我很难将这个算法迁移到Rust语言上,问题在于Rust通常使用迭代器(比如string1.chars())来获取字符,而不是通过下标访问。另外我也想了解该算法的JavaScript实现方式,有哪位开发者可以帮忙解答吗?

补充疑问

我解决这个问题的时候发现了一个有趣的点:生物学家是如何查找两段DNA或RNA序列的公共部分的?也欢迎相关科普解答。


内容的提问来源于stack exchange,提问作者Qiansen Zhou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:24:02