有没有办法找到两个字符串之间的相同部分?

时间:2019-08-16 22:14:01

标签: javascript string

我有两个带数字的变量,我需要弄清楚哪些才知道哪些部分是相同的。我想即使可能的话也可以使用两个以上的字符串。

我可以使用(var1.indexOf(?) > -1 && var2.indexOf(?) > -1),但必须覆盖所有可能的数字。 (或者字母,如果我想比较字符串)

如果在我的特定情况下有帮助,则这些数字来自以下类型的变量作为示例:

const originalVar1 = [1,3,2,0,6]
const var1 = originalVar1.sort().join('');
  const var1 = '01236';
  const var2 = '12345';
  let same = '';
  for (let i = 0; i < 10; i++) {
    same += (var1.indexOf(i) > -1 && var2.indexOf(i) > -1) ? `${i}` : '';
  }
  console.log(same); // Outputs: 123

我的解决方案可以工作,但感觉应该已经有一些内置的函数或方法可以做到这一点。也许我的解决方案可能会更优雅,因为它不能涵盖所有字符。

示例:

var1 = '01456'
var2 = '0246'
whatIsTheSame(var1, var2) // Expected output: 046

var1 = '12359'
var2 = '035679'
whatIsTheSame(var1, var2) // Expected output: 359

另一种解决方案

下面的

shash678解决方案非常适合为每个变量中出现的每个字符获取1个实例。以下解决方案为您提供了出现在每个变量中的每个字符的所有实例。

    value = [ '39291', '3902', '3039903', '39039311873', '3737298' ]
    value.sort((a, b) => b.length - a.length);
    let matches = value[0];
    for (let i = 1; i < value.length; i++) {
        matches = (matches.match(new RegExp(`[${value[i]}]`, 'g')) || []).join('');
    }
    console.log(matches); // Outputs: 393933

这是基于此处的以下答案:

https://stackoverflow.com/a/51179953/11866303按长度对数组进行排序

https://stackoverflow.com/a/41708135/11866303正则表达式解决方案

这可能会更优雅,但我不是最好的。谢谢大家。

2 个答案:

答案 0 :(得分:2)

使用扩展运算符并减少可满足您对n个参数数量的要求:

const whatIsTheSameHelper = (s1, s2) => {
  const s2Set = new Set(s2)
  return new Set([...s1].filter(x => s2Set.has(x)))
}

const whatIsTheSame = (...vars) => {
  return vars.reduce(whatIsTheSameHelper)
}

const var1 = '01236'
const var2 = '12345'
const var3 = '0246'
console.log(whatIsTheSame(var1, var2, var3))

输出:

Set { '2' }

答案 1 :(得分:0)

获得O(m + n)时间中两个数组的交集的通用ES6解决方案是将一个放入Set中,然后根据集合中的值过滤另一个:

const intersection = (array1, array2) => {
    const set2 = new Set(array2);
    return array1.filter(x => set2.has(x));
};

// alternatively, (array1, array2) => array1.filter(Set.prototype.has, new Set(array2));

const originalVar1 = [1, 3, 2, 0, 6];
const originalVar2 = [2, 4, 3, 1, 5];
console.log(intersection(originalVar1.sort(), originalVar2.sort()));

这将保留array1的顺序。如果在需要进行交点时只剩下字符串,则该函数是类似的。