mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-14 18:03:53 +08:00

* add test cases for checkAnagram function to cover additional inputs and edge cases * adjust spacing between tests to be more consistent with other files * update CheckAnagram to return boolean value instead of string * add a reference link and definition of Anagram to CheckAnagram documentation
48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
// An [Anagram](https://en.wikipedia.org/wiki/Anagram) is a string that is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
|
|
// Anagram check is case sensitive; i.e. Aba and aba is not a anagram.
|
|
// inputs are strings i.e. str1 and str2
|
|
const checkAnagram = (str1, str2) => {
|
|
// check that inputs are strings.
|
|
if (typeof str1 !== 'string' || typeof str2 !== 'string') {
|
|
return 'Not string(s)'
|
|
}
|
|
|
|
// If both strings have not same lengths then they can not be anagram.
|
|
if (str1.length !== str2.length) {
|
|
return false
|
|
}
|
|
|
|
// Use hashmap to keep count of characters in str1
|
|
|
|
const str1CharCount = new Map()
|
|
|
|
for (let i = 0; i < str1.length; i++) {
|
|
let previousCount = 0
|
|
if (str1CharCount.has(str1[i])) {
|
|
previousCount = str1CharCount.get(str1[i])
|
|
}
|
|
str1CharCount.set(str1[i], previousCount + 1)
|
|
}
|
|
|
|
// Now check if second string has same characters?
|
|
|
|
for (let i = 0; i < str2.length; i++) {
|
|
let previousCount = 0
|
|
// if str1CharCount has no key for str2[i] then not anagram.
|
|
if (!str1CharCount.has(str2[i])) return false
|
|
|
|
previousCount = str1CharCount.get(str2[i])
|
|
str1CharCount.set(str2[i], previousCount - 1)
|
|
}
|
|
|
|
// Now check if all entries in hashmap has zeros.
|
|
|
|
for (const key in str1CharCount) {
|
|
if (str1CharCount[key] !== 0) return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
export { checkAnagram }
|