字符串中的常见字符数 JavaScript

Common Character Count in Strings JavaScript

这是问题所在:

给定两个字符串,找出它们之间的共同字符数。

对于s1 = "aabcc"s2 = "adcaa",输出应该是3

我写了这段代码:

function commonCharacterCount(s1, s2) {
  var count = 0;
  var str = "";
  for (var i = 0; i < s1.length; i++) {
    if (s2.indexOf(s1[i]) > -1 && str.indexOf(s1[i]) == -1) {
      count++;
      str.concat(s1[i])
    }
  }

  return count;
}

console.log(commonCharacterCount("aabcc", "adcaa"));

它没有给出正确答案,我想知道我错在哪里?

因为 .concat 不会改变调用的字符串,但它 returns 是一个新字符串,请执行:

str = str.concat(s1[i]);

或者只是

str += s1[i];

您可以按照以下步骤进行操作:

  1. 创建一个function即return一个对象。 键作为字母并且计数为值
  2. 在主 function
  3. 中获取两个字符串的计数对象
  4. 使用 for..in
  5. 遍历任何对象
  6. 检查其他对象是否具有第一个对象的 key
  7. 如果使用 Math.min()
  8. 将最少的一个添加到 count

let s1 = "aabcc"
let s2 = "adcaa"

function countChars(arr){
  let obj = {};
  arr.forEach(i => obj[i] ? obj[i]++ : obj[i] = 1);
  return obj;
}


function common([...s1],[...s2]){
  s1 = countChars(s1);
  s2 = countChars(s2);
  let count = 0;
  for(let key in s1){
    if(s2[key]) count += Math.min(s1[key],s2[key]);
  }
  return count
}
console.log(common(s1,s2))

还有其他更高效的答案,但这个答案更容易理解。这遍历第一个字符串,并检查第二个字符串是否包含该值。如果是这样,则计数增加,并删除 s2 中的元素以防止重复。

function commonCharacterCount(s1, s2) {
    var count = 0;
    s1 = s1.split('');
    s2 = s2.split('');
    
    s1.forEach(e => {
      if (s2.includes(e)) {
        count++;
        s2.splice(s2.indexOf(e), 1);
      }
    });
        
    return count;
}

console.log(commonCharacterCount("aabcc", "adcaa"));

您可以存储每个字符的频率并查看此映射 (char->frequency) 并找到常见的字符。

function common(a, b) {
    const m1 = {};
    const m2 = {};
    let count = 0;
    for (const c of a) m1[c] = m1[c] ? m1[c]+1 : 1;
    for (const c of b) m2[c] = m2[c] ? m2[c]+1 : 1;
    for (const c of Object.keys(m1)) if (m2[c]) count += Math.min(m1[c], m2[c]);
    return count;
}

发题后,我发现我没看好例子。我以为它想要独特的普通角色.. 我改变了它,现在它是正确的

function commonCharacterCount(s1, s2) {
    var count = 0;
    var str="";
    for(var i=0; i<s1.length ; i++){
        if(s2.indexOf(s1[i])>-1){  
            count++;
            s2=s2.replace(s1[i],'');
        }
    }                   
        
    return count;
}

  • 为字符串 s1 创建 2 个包含字符及其计数的对象 和 s2

  • 计算 2 个对象中的公共键和 return 计数 - 将两个字符串中具有最小计数的公共键相加

  • O(n) - 时间和 O(n) - space 复杂度

    function commonCharacterCount(s1, s2) {

        let obj1 = {}
        let obj2 = {}

        for(let char of s1){

            if(!obj1[char]) {

                obj1[char] = 1

            } else

                obj1[char]++

        }

        for(let char of s2){

            if(!obj2[char]) {

                obj2[char] = 1

            } else

                obj2[char]++

        }

        console.log(obj1,obj2)

        let count = 0

        for(let key in obj1 ){

            if(obj2[key])

                count += Math.min(obj1[key],obj2[key])
        }

        return count


    }

我认为这样会更容易理解。 :)

function commonCharacterCount(s1: string, s2: string): number {
    
    let vs1 = [];
    let vs2 = [];
    let counter = 0;
    
    vs1 = Array.from(s1);
    vs2 = Array.from(s2);
    
    vs1.sort();
    vs2.sort();
    
    let match_char = [];
    
    for(let i = 0; i < vs1.length; i++){
        
        for(let j = 0; j < vs2.length; j++){
            
            if(vs1[i] == vs2[j]){
                match_char.push(vs1[i]);
                vs2.splice(j, 1);
                break;
            }
        }
    }    
    
    return match_char.length;
}

JavaScript ES6 干净的解决方案。使用for...of loop and includes方法。

var commonCharacterCount = (s1, s2) => {
  const result = [];
  const reference = [...s1];
  let str = s2;

  for (const letter of reference) {
    if (str.includes(letter)) {
      result.push(letter);
      str = str.replace(letter, '');
    }
  }

  // ['a', 'a', 'c'];
  return result.length;
};

// Test:
console.log(commonCharacterCount('aabcc', 'adcaa'));
console.log(commonCharacterCount('abcd', 'aad'));
console.log(commonCharacterCount('geeksforgeeks', 'platformforgeeks'));