Uczymy się sprawdzać, czy dwa napisy są anagramami – są utworzone z tych samych liter w takiej samej ilości, ale dowolnej kolejności, wielkość i spacje nie mają znaczenia.
Najpierw zobaczmy, jak usuwać spacje z tekstu:
function removeSpaces(str){
return str.replace(/\s/g, '');
}
console.log(removeSpaces(" Bla bla bla "));
Flaga g czyli global, \s czyli białe znaki, podmianka na pusty napis czyli usuwanie spacji.
Ok, pierwszy sposób to usunąć spacje, wszystko zrównać do małych liter, posortować i sprawdzić, czy jest ten sam napis:
function isAnagram(str1, str2) {
str1 = str1.replace(/\s/g, '').toLowerCase()
str2 = str2.replace(/\s/g, '').toLowerCase()
if (str1.length !== str2.length) {
return false
}
str1 = str1.split('').sort().join('')
str2 = str2.split('').sort().join('')
return str1 === str2
}
Ok, teraz lepsza wersja:
function isAnagram(str1, str2) {
str1 = str1.replace(/\s/g, '').toLowerCase();
str2 = str2.replace(/\s/g, '').toLowerCase();
if (str1.length !== str2.length) {
return false;
}
let counter = new Map();
for (let letter of str1) {
if(!counter.has(letter))
counter.set(letter, 1);
else
counter.set(letter, counter.get(letter)+1)
}
for (let letter of str2) {
if(!counter.has(letter))
return false;
if(counter.get(letter) < 0)
return false;
counter.set(letter, counter.get(letter)-1);
}
return true;
}
Bardzo ważne jest, abyśmy rozumieli, co robimy i nie kopiowali przykładów z internetu na ślepo. W przykładzie znalezionym w internecie ja na przykład zauważyłem, że najpierw porównują długość napisów i zwracają false, a dopiero potem usuwają spacje…
Generalnie przechodzimy po wszystkich literach pierwszego napisu i dopisujemy je oraz ich count.
Potem przechodzimy po drugim i odejmujemy ich count, a jak jakiejś nie ma to zwracamy fałsz… Jakby ich ilość okazała się poniżej 0 to tak samo.
W przykładzie, który znalazłem w internecie:
- Najpierw porównywali długość napisów, a później zamieniali spacje na puste znaki
- Nie sprawdzali, czy ilość liter nie spadła poniżej zera (jakby has sprawdzało prawdziwość wartości a nie tylko istnienie klucza)
To tak ku przestrodze.