检查两个字符串是否在JavaScript中共享一个公共子字符串

nic*_*mon 3 javascript

可能重复:
在Java中比较字符串的最佳方法?

JavaScript中有没有一种快速的方法来找出2个字符串是否包含相同的子字符串?例如,我有以下两个字符串:“ audi是一辆汽车”和“ audiA8”。

如您所见,两个字符串中都包含“ audi”一词,但indexOf由于两个字符串中都有其他字符,因此我们无法使用简单的或RegExp 来找到它。

sle*_*man 5

BLAST程序是在生物信息学中执行此类操作的标准工具。它用于比较分子的两个片段(例如DNA或蛋白质),以发现它们彼此对齐的位置-基本上是两个字符串(有时大小为数GB)共享公共子字符串的位置。

基本算法很简单,只需系统地将其中一个字符串分成多个部分,然后将它们与另一个字符串进行比较即可。一个简单的实现将是这样的:

// Note: not fully tested, there may be bugs:

function subCompare (needle, haystack, min_substring_length) {

    // Min substring length is optional, if not given or is 0 default to 1:
    min_substring_length = min_substring_length || 1;

    // Search possible substrings from largest to smallest:
    for (var i=needle.length; i>=min_substring_length; i--) {
        for (j=0; j <= (needle.length - i); j++) {
            var substring = needle.substr(j,i);
            var k = haystack.indexOf(substring);
            if (k != -1) {
                return {
                    found : 1,
                    substring : substring,
                    needleIndex : j,
                    haystackIndex : k
                }
            }
        }
    }
    return {
        found : 0
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以修改此算法以进行更多复杂的搜索,例如忽略大小写,模糊匹配子字符串,查找多个子字符串等。这只是基本思想。


dfs*_*fsq 2

在这里查看类似的文本函数实现。它返回两个字符串中匹配字符的数量。

对于您的示例,它将是:

similar_text("audi is a car", "audiA8") // -> 4
Run Code Online (Sandbox Code Playgroud)

这意味着字符串有 4 个字符的公共子字符串。