计算匹配的字母一次

Count matching letters once

我正在创建一个儿童学习工具,其形式可以匹配一个单词的 4 个字母。

我想统计一个单词中匹配的字符数。但它将重复的字母计为 2 个而不是 1 个。例如,如果单词是 "loot",并且用户提交 "flop",匹配的字母是 3 而不是 2,因为它计算了 "o" 两次。我该如何解决?非常感谢

       function countMatching(str1, str2) {
            var c = 0;

            for (var i = 0; i < str1.length; i++) {

              if (str2.includes(str1[i]))
                c += 1;
                
            }
            matchingLetters = c;
          }

一种使用集合的可能方法。 我将字符串转换为一个集合并返回到一个数组 所以如果 str1loot 那么 str1Set 将是 ['l','o','t']。其余相同

let matchingLetters;

function countMatching(str1, str2) {
            var c = 0;
            str1Set = [...new Set([...str1])]
            str2Set = [...new Set([...str2])]
            
            for (var i = 0; i < str1Set.length; i++) {

              if (str2Set.includes(str1Set[i]))
                c += 1;
                
            }
            matchingLetters = c;
          }
          
          
countMatching('loot', 'flop') 
console.log(matchingLetters)

function countMatching(str1, str2) {
            var c = [];

            for (var i = 0; i < str1.length; i++) {

              if (str2.includes(str1[i]))
                  if (!c.includes(str1[i])) c.push(str1[i])
                
            }
            matchingLetters = c.length;
          }

我是在标签上写的,所以可能会有错误

我所做的是使 c 成为一个列表,其中包含两个字符串之间共享的每个字符。并且只有当该字符不存在时才会将新字符推送到 c 中,从而使其成为唯一字符列表。

然后您可以获得列表的长度,甚至可以将列表用于其他目的

我做了一个@cmgchess 答案的替代版本,它创建了一个字母的实际解决方案数组,仍然可以猜测,并删除输入的解决方案中遇到的每个字母。

let matchingLetters;

function countMatching(str1, str2) {
            var c = 0;
            str1Arr = str1.split('');
            
            for (var i = 0; i < str2.length; i++) {

              if (str1Arr.includes(str2[i])) {
                c += 1;
                str1Arr.splice(str1Arr.indexOf(str2[i]), 1);
              }
                
            }
            matchingLetters = c;
          }
          
          
countMatching('loot', 'boot') 
console.log(matchingLetters)