如何用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
相关产品推荐
相关产品推荐

