【问题标题】:How do you check two strings in JS and determine if any letters in each is placed in the same letter row?如何检查 JS 中的两个字符串并确定每个字符串中是否有任何字母放在同一字母行中?
【发布时间】:2021-11-19 19:49:29
【问题描述】:

我一直在寻找解决方案,但似乎找不到。我正在尝试创建一个函数来检查两个不同的字符串以识别每个单词相同位置的任何单词,并将其作为数字输出。一个例子:

“无菌” “会议”

这两个词在同一个地方有一个 E 和一个 I。别介意两者都存在但被打乱的字母(我有一个解决方案,但恐怕它对我没有帮助)。我正在尝试为匹配的两个字母构建输出 2 的东西。

所以是的,我该如何让它工作?下面的代码是无效的,它检查两者中的现有字母,而不是它们在单词中是否完全匹配。也许我发现它有问题?

var str1 = "sterile";
var str2 = "meeting";


function second() {
    return Array.prototype.filter.call(str1, function(c) {
        return str2.indexOf(c) === -1;
    }, this).join('');
}

function second() {
    return Array.prototype.filter.call(str1, function(c) {
        return str2.indexOf(c) === -1;
    }, this).join('');
}

console.log(second(str1, str2));
console.log(str1.length - second(str1, str2).length);
```

【问题讨论】:

    标签: javascript string compare


    【解决方案1】:

    可以优化并且可以计算一些边缘情况,但这可能会。

    const str1 = 'sterile';
    const str2 = 'meetinghey';
    
    function stringEqualityCheck(str1, str2) {
      const longestString = str1.length > str2.length ? str1 : str2;
      const longestStringArray = longestString.split('');
    
      const shortestString = str1.length > str2.length ? str2 : str1;
    
      let equalityCounter = 0;
    
      shortestString.split('').forEach((letter, index) => {
        if (letter === longestStringArray[index]) {
          equalityCounter++;
        }
      });
    
      return equalityCounter;
    }
    
    console.log(stringEqualityCheck(str1, str2));

    【讨论】:

      【解决方案2】:

      这应该可以完成工作:)

      const str1 = "sterile";
      const str2 = "meetinghey";
      
      
      const getSameLetters = (a, b) => {
        const minLength = Math.min(a.length, b.length);
        const sameLetters = []
        for (let i = 0; i < minLength; i++) {
          if (a[i] === b[i]) {
            sameLetters.push({ i, letter: a[i] })
          }
        }
        return sameLetters
      }
      
      console.log(getSameLetters(str1, str2))

      或以下,如果您只关心相同字母的数量:

      const str1 = "sterile";
      const str2 = "meetinghey";
      
      
      const getSameLetters = (a, b) => {
        const minLength = Math.min(a.length, b.length);
        let sameLetters = 0
        for (let i = 0; i < minLength; i++) {
          if (a[i] === b[i]) {
            sameLetters++
          }
        }
        return sameLetters
      }
      
      console.log(getSameLetters(str1, str2))

      这些算法背后的想法是这样的:

      1. 由于我们只想在两个单词中查找在相同索引上匹配的字母,因此我们应该只迭代直到最小单词的结尾。因为您不想将未定义的“char”与另一个字符串中的“char”进行比较——它们永远不会匹配。这就是Math.min(a.length, b.length) 的发现。
      2. 然后我们从零迭代到minLength。在每个循环循环中,我们比较来自ab 字符串的相同索引上的字母。如果字母匹配,则将sameLetters 加一,然后继续循环。
      3. 返回sameLetters - 就是我们要找的号码,同一个索引下同一个字母的号码:)

      【讨论】:

      • 太棒了,正是我想要的!如果你介意,你能解释一下它是如何工作的吗?我对它如何循环并检查哪些字母匹配感到有点困惑
      • 我很高兴)在答案中添加了关于算法的解释:)
      • 谢谢你的解释,我现在明白了。以前从未使用过 Math.min,但这很有意义。干杯!
      【解决方案3】:

      实现此目的的一个简单的方法是使用split 将其中一个单词拆分为一个数组,然后使用forEach 遍历该数组以查看每个位置的字符是否等于该位置的字符换句话说,相同的位置,如果它们相同,则增加计数器。

      const str1 = "sterile";
      const str2 = "meeting";
      
      checkWords = (a, b) => {
        let count = 0;
        a.split('').forEach((letter, index) => letter === b[index] ? count++ : '');
        return count;
      }
      console.log(checkWords(str1,str2));

      【讨论】:

        猜你喜欢
        • 2011-04-03
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        • 2017-10-18
        • 1970-01-01
        • 2011-12-24
        • 2015-01-31
        相关资源
        最近更新 更多