快速查找两个字符串是否具有共同字符的方法

exe*_*ook 9 javascript string comparison

我有各种字符串比较和差异算法,但在某些时候,在我应用它们之前,我想找到两个字符串是否至少有一个共同的字符.这样我就可以跳过更复杂的功能.所以我需要一个非常快速的JavaScript函数来查找字符串A和字符串B是否至少有一个共同字符.

首先,我想为字符串A创建一个字符映射,然后检查字符串B中的每个字符对着该映射,直到找到某些内容.但后来我才意识到,如果两个字符串都很大并且它们有一个共同的第一个字符,那么为字符串A创建一个完整的映射效率会很低.

更新:有人回答使用indexOf(),这让我感到困惑.也许短语"有共同的字符"意味着"字符串是另一个字符串"是一样的吗?让我举一个我想要的例子:

例如JavaScript,Stop and stay有一个S共同的角色.其他例子是please look right,break the ice他们有一个k共同的性格.

Jen*_*nsB 5

最简单的方法是循环遍历一个字符串中的每个字母,看看另一个字符串是否包含任何单个字母。

除非字符串一开始就按字母顺序排序,否则没有比检查每个字母更有效的方法了。

function anythingInCommon(a, b){
    if( b.length < a.length )
        return anythingInCommon(b, a)

    for( var i = 0, len = a.length; i < len; i++ ) 
        if(b.indexOf(a[i]) != -1)
            return true;
  
    return false
}

console.log(
  anythingInCommon("aaaaaaaaaaaaaabbbbbbccccc", "xc"),
  anythingInCommon("aaaaaaaaaaaaaabbbbbbccccc", "x")
)
Run Code Online (Sandbox Code Playgroud)

anythingInCommon('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','cddabddde')
Run Code Online (Sandbox Code Playgroud)

提琴手: http: //jsfiddle.net/LRxGK/4/

  • +1保持简单。您还可以检查“stra”和“strb”并迭代最短的 (2认同)
  • 您可以将“if”重写为“if (strb.length &lt; stra.length) return everythingInCommon(strb, stra)”,而不是使用“temp”变量。这只是以相反的顺序调用参数的函数。这样,如果任一字符串很大,我们就不会通过使用“temp”复制字符串来浪费内存。 (2认同)

gau*_*430 2

单程 ,

实际上扩展了你的地图方法

为您的角色集创建两个bit Arrays,比如说为a-z您创建一个bit array of 26,以及您遇到的任何角色set the flag to 1。因此,您string A一次读取一个字符,并lookup in string B's flagArray查看相应的位是否打开(否则在字符串 A 的 flagArray 中将此位设置为“on”),在同一次迭代中,对字符串 B 的当前字符和 A 的 flagarray 执行此操作,如果它们都不匹配,然后为两个位数组中的当前字符设置相关位