Anagram Check Techniques in DSA Python - Time & Space Complexity
We want to understand how the time needed to check if two words are anagrams changes as the words get longer.
How does the work grow when the input size grows?
Analyze the time complexity of the following code snippet.
def are_anagrams(s1: str, s2: str) -> bool:
if len(s1) != len(s2):
return False
count = {}
for char in s1:
count[char] = count.get(char, 0) + 1
for char in s2:
if char not in count or count[char] == 0:
return False
count[char] -= 1
return True
This code checks if two strings are anagrams by counting characters in the first string and then matching counts with the second.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two loops each going through all characters of the strings.
- How many times: Each loop runs once over all characters, so about n times each, where n is string length.
As the strings get longer, the number of steps grows roughly twice as fast because we check each character twice.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 steps |
| 100 | About 200 steps |
| 1000 | About 2000 steps |
Pattern observation: The work grows linearly with input size; doubling input roughly doubles work.
Time Complexity: O(n)
This means the time to check anagrams grows in a straight line with the length of the strings.
[X] Wrong: "Sorting both strings and comparing is always faster."
[OK] Correct: Sorting takes more time (O(n log n)) than counting characters (O(n)), so counting is usually faster for anagram checks.
Understanding how to analyze and compare different anagram checking methods helps you explain your choices clearly and confidently in interviews.
"What if we used sorting both strings instead of counting characters? How would the time complexity change?"
Practice
Solution
Step 1: Understand the definition of anagrams
Anagrams are words or phrases made by rearranging the letters of another, so they must have the same characters.Step 2: Compare the character sets
If two strings have exactly the same characters, just in different orders, they are anagrams.Final Answer:
They contain the same characters in any order -> Option AQuick Check:
Anagrams = same characters [OK]
- Thinking same length means anagrams
- Only checking first or last character
- Ignoring character counts
s1 and s2 are anagrams using sorting?Solution
Step 1: Understand sorting strings in Python
The sorted() function returns a new sorted list of characters from the string.Step 2: Compare sorted lists for equality
If sorted(s1) equals sorted(s2), both strings have the same characters in the same counts.Final Answer:
sorted(s1) == sorted(s2) -> Option BQuick Check:
sorted strings equal means anagrams [OK]
- Using .sort() on strings (strings have no sort method)
- Comparing reversed strings instead of sorted
- Only checking length equality
from collections import Counter s1 = 'listen' s2 = 'silent' print(Counter(s1) == Counter(s2))
Solution
Step 1: Understand Counter usage
Counter counts the frequency of each character in the string.Step 2: Compare Counters for equality
Since 'listen' and 'silent' have the same characters with same counts, their Counters are equal.Final Answer:
True -> Option CQuick Check:
Counter equality means anagrams [OK]
- Expecting False because strings differ in order
- Confusing Counter with sorting
- Not importing collections module
def are_anagrams(s1, s2):
return s1.sort() == s2.sort()Solution
Step 1: Check string methods
Strings in Python do not have a sort() method; only lists do.Step 2: Identify correct approach
Use sorted(s1) and sorted(s2) which return sorted lists for comparison.Final Answer:
Strings do not have a sort() method -> Option DQuick Check:
sort() not valid on strings [OK]
- Trying to call .sort() on strings
- Comparing reversed strings instead of sorted
- Ignoring return value of sorted()
Solution
Step 1: Normalize strings by lowering case and removing spaces
Use s1.lower().replace(' ', '') and similarly for s2 to ignore case and spaces.Step 2: Sort normalized strings and compare
Sorting ensures characters are in order for easy comparison.Final Answer:
sorted(s1.lower().replace(' ', '')) == sorted(s2.lower().replace(' ', '')) -> Option AQuick Check:
Normalize then sort to check anagrams ignoring spaces/case [OK]
- Not removing spaces before comparison
- Not converting to lowercase
- Using Counter without normalization
Ready to prove it?
Pass the test and this pattern moves unknown
