Мой код неправильно сравнивает две разные строки - PullRequest
2 голосов
/ 21 июня 2020

Я пытаюсь решить эту проблему кодовых войн:

Завершите скремблирование функции (str1, str2), которая возвращает true, если часть символов str1 может быть изменена для соответствия str2, в противном случае возвращает false.

примеры:

 scramble('rkqodlw', 'world') ==> True
 scramble('cedewaraaossoqqyt', 'codewars') ==> True 
 scramble('katas', 'steak') ==> False

Это моя попытка:

function scramble(str1, str2) {
  let obj1 = {};
  let obj2 = {};
  for (el of str1) {
    obj1[el] = (obj1[el] || 0) + 1;
  }
  for (el of str2) {
    obj2[el] = (obj2[el] || 0) + 1;
  }
  for (el in obj2) {
    if (!(el in obj1)) return false;
  }
  return true;
}

Я конвертирую строки в объекты, а затем сравниваю ключи друг с другом . Мой код проходит около 90% всех тестов в Codewars, но затем он не проходит остальные 10%, и они, к сожалению, не показывают, какие входные данные теста.

Я подозреваю, что есть несколько преимуществ случаи, когда этот код не улавливает. Любая помощь приветствуется.

Ответы [ 4 ]

2 голосов
/ 21 июня 2020

Вам нужно будет обработать случай, когда str2 имеет больше экземпляров буквы, чем str1.

Например:

scramble("a", "aa")

Что должно оцениваться как false (не достаточно "а" в "а", чтобы образовать "аа").

1 голос
/ 21 июня 2020

Вам необходимо обработать количество символов . Теперь вы просто проверяете, существует ли символ из str2 также в str1.

Итак, вместо:

 for (el in obj2) {
    if (!(el in obj1)) return false;
  }

Попробуйте:

for (let [key, value] of Object.entries(obj2)) {
    if (obj1[key] === undefined || obj1[key] < value) return false;
  }

Что означает что если obj1[key] не существует или встречается меньше, чем obj2[key], он вернет false .

1 голос
/ 21 июня 2020

этот код может помочь

function scramble(str1, str2) {

    let occurences = str1.split("").reduce((arr, cur) => { arr[cur] ? arr[cur]++ : arr[cur] = 1; return arr; }, {});

    console.log(occurences);

    return str2.split("").every((character) => --occurences[character] >= 0);
}

console.log(scramble("awpoirwled", "world"));
0 голосов
/ 21 июня 2020

Алгоритм, который я бы использовал, состоит в том, чтобы взять каждую букву строки соответствия, и, если она получила эквивалент в искомой строке, удалить ее оттуда и продолжить, в противном случае прервать работу, если совпадения нет. Если вы дойдете до конца строки соответствия без прерывания, то у вас есть совпадение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...