общее количество символов в строках javascript - PullRequest
1 голос
/ 09 марта 2019

Вот проблема: учитывая две строки, найдите количество общих символов между ними.и пример этого:

Для 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;
}

Это не дает правильного ответа, я хочу знать, где я не прав?Большое спасибо за любую помощь

Ответы [ 5 ]

2 голосов
/ 09 марта 2019

Вы можете сделать это в следующих шагах:

  1. Создайте function, который возвращает объект. С клавишами в качестве букв и в качестве значений
  2. Получите объект подсчета обеих ваших строк в главном function
  3. Итерация по любому объекту с использованием for..in
  4. Проверьте, есть ли у другого объекта key первого объекта.
  5. Если нужно добавить хотя бы один из них к count, используя Math.min()

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))
1 голос
/ 09 марта 2019

Причина .concat не изменяет вызванную строку, но возвращает новую, выполните:

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

или просто

str += s1[i];
0 голосов
/ 09 марта 2019

После публикации вопроса я обнаружил, что не выглядел хорошо.я думал, что он хочет уникальные общие символы .. и я изменил его, и теперь его право

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;
}
0 голосов
/ 09 марта 2019

Вы можете сохранить частоты каждого из символов и перейти по этой карте (символ-> частота) и найти общие.

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;
}
0 голосов
/ 09 марта 2019

Есть и другие, более эффективные ответы, но этот ответ легче понять. Это перебирает первую строку и проверяет, содержит ли вторая строка это значение. Если это так, счет увеличивается, и этот элемент из 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"));
...