From 9ac94c09ebc4d25caf3527350ff61d3ba93431e2 Mon Sep 17 00:00:00 2001 From: Morteza Date: Sun, 31 Oct 2021 03:41:39 -0700 Subject: [PATCH] Improve checking anagrams in O(n) with dictionary (#4806) --- strings/check_anagrams.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/strings/check_anagrams.py b/strings/check_anagrams.py index 62a4441a0..938bf4c2a 100644 --- a/strings/check_anagrams.py +++ b/strings/check_anagrams.py @@ -1,6 +1,7 @@ """ wiki: https://en.wikipedia.org/wiki/Anagram """ +from collections import defaultdict def check_anagrams(first_str: str, second_str: str) -> bool: @@ -16,10 +17,30 @@ def check_anagrams(first_str: str, second_str: str) -> bool: >>> check_anagrams('There', 'Their') False """ - return ( - "".join(sorted(first_str.lower())).strip() - == "".join(sorted(second_str.lower())).strip() - ) + first_str = first_str.lower().strip() + second_str = second_str.lower().strip() + + # Remove whitespace + first_str = first_str.replace(" ", "") + second_str = second_str.replace(" ", "") + + # Strings of different lengths are not anagrams + if len(first_str) != len(second_str): + return False + + # Default values for count should be 0 + count = defaultdict(int) + + # For each character in input strings, + # increment count in the corresponding + for i in range(len(first_str)): + count[first_str[i]] += 1 + count[second_str[i]] -= 1 + + for _count in count.values(): + if _count != 0: + return False + return True if __name__ == "__main__":