понимание решения валидной анаграммы в javascript - PullRequest
0 голосов
/ 06 ноября 2019

Это из LeetCode - Действительная анаграмма

Учитывая две строки s и t, напишите функцию, чтобы определить, является ли t анаграммой s.
Пример 1:
Input: s = "anagram ", t =" nagaram "
Вывод: true
Пример 2:

Можно предположить, что строка содержит только строчные буквы.

Последующие действия: Что, если входные данные содержатсимволы юникода? Как бы вы адаптировали свое решение к такому случаю?

Я не понимаю приведенный ниже код

  • result1 [s.charCodeAt (i) - 97] ++;-> что означает ++?
  • result2.length = 26;-> что означает 26?
  • result2.fill (0);-> почему он заполняется 0?

Пожалуйста, сообщите!

var isAnagram = function(s,t) {
    if (s.length !== t.length)
        result false;
    const result1 = [];
    result1.length = 26;
    result1.fill(0);

    const result2 = [];
    result2.length = 26;
    result2.fill(0);

    for (let i = 0; i < s.length; i++) {
        result1[s.charCodeAt(i) - 97]++;
        result2[t.charCodeAt(i) - 97]++;
    }

    for (let i = 0; i < result1.length; i++) {
        if (result1[i] !== result2[i]) {
            return false;
        }
    }
    return true;
};

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Это несколько плохо написанный код, давайте немного его улучшим, чтобы ваш вопрос автоматически исчез:

var isAnagram = function(string1, string2) {
    if (string1.length !== string2.length)
        return false; // here was a typo: result false

    const alphabetLength = 26;
    // returns an array of zeros (empty counters), each one per alphabet letter
    const getAlphabetCounters = function() {
        const counters = [];
        counters.length = alphabetLength;
        counters.fill(0);
        return counters;
    }
    const countCharacter = function(c, counters) {
        // zero for a, 25 for z
        const position = c.charCodeAt(0) - 97;
        counters[position]++;
    }

    const counters1 = getAlphabetCounters();
    const counters2 = getAlphabetCounters();

    for (let i = 0; i < string1.length; i++) {
        countCharacter(string1[i], counters1);
        countCharacter(string2[i], counters2);
    }

    for (let i = 0; i < counters1.length; i++) {
        if (counters1[i] !== counters2[i]) {
            return false;
        }
    }
    return true;
};

Но, возможно, было бы лучше использовать такой «декрементный» подход, как этот:

var isAnagram = function(string1, string2) {
    if (string1.length !== string2.length)
        return false;

    let letters1 = string1.split('');
    let letters2 = string2.split('');
    for (let letter of letters1) {
        let position = letters2.indexOf(letter);
        if(position == -1)
            return false;
        letters2.splice(position, 1);
    }
    return true;
};

или, если кто-то заботится о производительности для длинных строк, сортировка букв в них и прямое сравнение были бы подходящими.

0 голосов
/ 06 ноября 2019

++ - оператор приращения. Он может быть предварительно фиксированным (++ i) или постфиксным (i ++). В этом случае он постфиксируется: result1[s.charCodeAt(i) - 97]++, поэтому он будет увеличивать значение result1[s.charCodeAt(i) - 97].

26 - это просто количество букв в алфавите (от a до z).

Код инициализирует два массива и fill присваивает им 0, чтобы он мог использовать элементы массива в качестве счетчиков. Каждый индекс в массиве представляет букву в алфавите и сохраняет вхождения этой буквы в строке.

...