Anagram Check Techniques in DSA C - 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 input size increases?
Analyze the time complexity of the following code snippet.
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
bool areAnagrams(char *str1, char *str2) {
int count[256] = {0};
int i;
for (i = 0; str1[i] && str2[i]; i++) {
count[(unsigned char)str1[i]]++;
count[(unsigned char)str2[i]]--;
}
if (str1[i] || str2[i]) return false;
for (i = 0; i < 256; i++) {
if (count[i] != 0) return false;
}
return true;
}
This code checks if two strings are anagrams by counting character frequencies.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two loops: one to count characters in both strings, one to check counts.
- How many times: First loop runs once per character until string ends (n times), second loop runs 256 times (constant).
The first loop grows with the length of the strings, doing work for each character. The second loop always does the same amount of work (256 checks), no matter the input size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | ~10 + 256 = 266 |
| 100 | ~100 + 256 = 356 |
| 1000 | ~1000 + 256 = 1256 |
Pattern observation: The work grows mostly in a straight line with input size because the first loop depends on string length, while the second loop is constant.
Time Complexity: O(n)
This means the time to check anagrams grows linearly with the length of the strings.
[X] Wrong: "The second loop over 256 characters makes the algorithm O(n * 256) which is quadratic."
[OK] Correct: The second loop runs a fixed 256 times regardless of input size, so it is constant time and does not multiply with n.
Understanding how counting characters leads to linear time helps you explain efficient solutions clearly and confidently in interviews.
"What if we sorted both strings first and then compared them? 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 length alone defines anagrams
- Assuming same start or end means anagram
- Ignoring character counts
Solution
Step 1: Understand sorting approach
Sorting both strings puts their characters in order, so if they are anagrams, sorted strings will be identical.Step 2: Use strcmp to compare sorted strings
strcmp returns 0 if strings are equal, confirming anagram status.Final Answer:
Sort both strings and compare with strcmp -> Option DQuick Check:
Sort + strcmp = correct anagram check [OK]
- Comparing strings without sorting
- Ignoring length check before sorting
- Using strcmp on unsorted strings
#include
#include
#include
bool areAnagrams(char *str1, char *str2) {
int count[256] = {0};
int i;
for (i = 0; str1[i] && str2[i]; i++) {
count[(unsigned char)str1[i]]++;
count[(unsigned char)str2[i]]--;
}
if (str1[i] || str2[i]) return false;
for (i = 0; i < 256; i++) {
if (count[i] != 0) return false;
}
return true;
}
int main() {
if (areAnagrams("listen", "silent"))
printf("Anagrams\n");
else
printf("Not Anagrams\n");
return 0;
}Solution
Step 1: Analyze character counting logic
The function increments count for each char in str1 and decrements for str2. If strings are anagrams, counts balance to zero.Step 2: Check string lengths and counts
Strings "listen" and "silent" have same length and characters, so count array ends with all zeros, returning true.Final Answer:
Anagrams -> Option AQuick Check:
Balanced counts = anagrams [OK]
- Not checking string length equality
- Ignoring unsigned char cast for indexing
- Returning true without count check
bool isAnagram(char *s1, char *s2) {
int count[26] = {0};
for (int i = 0; s1[i]; i++) {
count[s1[i] - 'a']++;
count[s2[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (count[i] != 0) return false;
}
return true;
}Solution
Step 1: Check loop and length conditions
The loop runs only while s1[i] is valid, but s2 may be shorter or longer, causing mismatch.Step 2: Identify missing length check
Without verifying s1 and s2 have same length, function may incorrectly return true or access invalid memory.Final Answer:
Does not check if strings have same length -> Option CQuick Check:
Length check missing = bug [OK]
- Assuming strings are always same length
- Ignoring null terminator in second string
- Not handling uppercase letters (less critical here)
Solution
Step 1: Normalize strings by case and spaces
Convert all letters to lowercase and remove spaces to compare only meaningful characters.Step 2: Count characters or sort normalized strings
After normalization, counting characters or sorting will correctly identify anagrams ignoring case and spaces.Final Answer:
Convert both to lowercase, remove spaces, then count characters -> Option BQuick Check:
Normalize case and spaces before checking [OK]
- Comparing strings with spaces included
- Ignoring case differences
- Assuming length check includes spaces
Ready to prove it?
Pass the test and this pattern moves unknown
