|
| 1 | +// Anagram check is case sensitive; i.e. Aba and aba is not a anagram. |
| 2 | +// inputs are strings i.e. str1 and str2 |
| 3 | +const checkAnagram = (str1, str2) => { |
| 4 | + // check that inputs are strings. |
| 5 | + if (typeof str1 !== 'string' || typeof str2 !== 'string') { |
| 6 | + return 'Not string(s)' |
| 7 | + } |
| 8 | + |
| 9 | + // If both strings have not same lengths then they can not be anagram. |
| 10 | + if (str1.length !== str2.length) { |
| 11 | + return 'Not Anagram' |
| 12 | + } |
| 13 | + |
| 14 | + // Use hashmap to keep count of characters in str1 |
| 15 | + |
| 16 | + const str1CharCount = new Map() |
| 17 | + |
| 18 | + for (let i = 0; i < str1.length; i++) { |
| 19 | + let previousCount = 0 |
| 20 | + if (str1CharCount.has(str1[i])) { |
| 21 | + previousCount = str1CharCount.get(str1[i]) |
| 22 | + } |
| 23 | + str1CharCount.set(str1[i], previousCount + 1) |
| 24 | + } |
| 25 | + |
| 26 | + // Now check if second string has same characters? |
| 27 | + |
| 28 | + for (let i = 0; i < str2.length; i++) { |
| 29 | + let previousCount = 0 |
| 30 | + // if str1CharCount has no key for str2[i] then not anagram. |
| 31 | + if (!str1CharCount.has(str2[i])) { |
| 32 | + return 'Not anagrams' |
| 33 | + } |
| 34 | + previousCount = str1CharCount.get(str2[i]) |
| 35 | + str1CharCount.set(str2[i], previousCount - 1) |
| 36 | + } |
| 37 | + |
| 38 | + // Now check if all entries in hashmap has zeros. |
| 39 | + |
| 40 | + for (const key in str1CharCount) { |
| 41 | + if (str1CharCount[key] !== 0) { return 'Not anagrams' } |
| 42 | + } |
| 43 | + |
| 44 | + return 'Anagrams' |
| 45 | +} |
| 46 | + |
| 47 | +console.log(checkAnagram('abcd', 'bcad')) // should print anagram |
| 48 | +console.log(checkAnagram('abcd', 'abef')) // should print not anagram |
| 49 | +console.log(checkAnagram(10, 'abcd'))// should print Not String(s). |
| 50 | +console.log(checkAnagram('abs', 'abds'))// should print not anagram |
0 commit comments