Write a function to check whether two given strings are anagram of each other or not. An anagram of a string is another string that contains the same characters, only the order of characters can be different. For example, “abcd” and “dabc” are an anagram of each other.
We strongly recommend that you click here and practice it, before moving on to the solution.
Method 1 (Use Sorting):
- Sort both strings
- Compare the sorted strings
Below is the implementation of the above idea:
Python
# Python program to check whether two # strings are anagrams of each other # Function to check whether two strings # are anagram of each other def areAnagram(str1, str2): # Get lengths of both strings n1 = len (str1) n2 = len (str2) # If length of both strings is not # same, then they cannot be anagram if n1 ! = n2: return 0 # Sort both strings str1 = sorted (str1) str2 = sorted (str2) # Compare sorted strings for i in range ( 0 , n1): if str1[i] ! = str2[i]: return 0 return 1 # Driver code str1 = "test" str2 = "ttew" # Function Call if areAnagram(str1, str2): print ( "The two strings are anagram of each other" ) else : print ( "The two strings are not anagram of each other" ) # This code is contributed by Bhavya Jain |
The two strings are not anagram of each other
Time Complexity: O(nLogn)
Auxiliary space: O(1).
Method 2 (Count characters):
This method assumes that the set of possible characters in both strings is small. In the following implementation, it is assumed that the characters are stored using 8 bit and there can be 256 possible characters.
- Create count arrays of size 256 for both strings. Initialize all values in count arrays as 0.
- Iterate through every character of both strings and increment the count of character in the corresponding count arrays.
- Compare count arrays. If both count arrays are same, then return true.
Below is the implementation of the above idea:
Python
# Python program to check if two strings # are anagrams of each other NO_OF_CHARS = 256 # Function to check whether two strings # are anagram of each other def areAnagram(str1, str2): # Create two count arrays and initialize # all values as 0 count1 = [ 0 ] * NO_OF_CHARS count2 = [ 0 ] * NO_OF_CHARS # For each character in input strings, # increment count in the corresponding # count array for i in str1: count1[ ord (i)] + = 1 for i in str2: count2[ ord (i)] + = 1 # If both strings are of different length. # Removing this condition will make the # program fail for strings like "aaca" # and "aca" if len (str1) ! = len (str2): return 0 # Compare count arrays for i in xrange (NO_OF_CHARS): if count1[i] ! = count2[i]: return 0 return 1 # Driver code str1 = "neveropen" str2 = "forneveropenneveropen" # Function call if areAnagram(str1, str2): print ( "The two strings are anagram of each other" ) else : print ( "The two strings are not anagram of each other" ) # This code is contributed by Bhavya Jain |
The two strings are anagram of each other
Time Complexity: O(n)
Auxiliary space: O(n).
Method 3 (count characters using one array):
The above implementation can be further to use only one count array instead of two. We can increment the value in count array for characters in str1 and decrement for characters in str2. Finally, if all count values are 0, then the two strings are anagram of each other. Thanks to Ace for suggesting this optimization.
Python3
# Python program to check if two strings # are anagrams of each other NO_OF_CHARS = 256 # Function to check if two strings # are anagrams of each other def areAnagram(str1,str2): # Create a count array and initialize # all values as 0 count = [ 0 for i in range (NO_OF_CHARS)] i = 0 # For each character in input strings, # increment count in the corresponding # count array for i in range ( len (str1)): count[ ord (str1[i]) - ord ( 'a' )] + = 1 ; count[ ord (str2[i]) - ord ( 'a' )] - = 1 ; # If both strings are of different # length. Removing this condition # will make the program fail for # strings like "aaca" and "aca" if ( len (str1) ! = len (str2)): return False ; # See if there is any non-zero # value in count array for i in range (NO_OF_CHARS): if (count[i] ! = 0 ): return False return True # Driver code str1 = "neveropen" str2 = "forneveropenneveropen" # Function call if (areAnagram(str1, str2)): print ( "The two strings are anagram of each other" ) else : print ( "The two strings are not anagram of each other" ) # This code is contributed by patel2127 |
The two strings are anagram of each other
Time Complexity: O(n)
Auxiliary space: O(n).
Method 4 (Using Counter() function):
- Count all the frequencies of the 1st string and 2nd string using the counter() function.
- If they are equal then both the strings are anagrams.
Python3
# Python3 program for the above approach from collections import Counter # Function to check if two strings are # anagram or not def check(s1, s2): # implementing counter function if (Counter(s1) = = Counter(s2)): print ( "The two strings are anagram of each other" ) else : print ( "The two strings are not anagram of each other" ) # driver code s1 = "neveropen" s2 = "forneveropenneveropen" check(s1, s2) # This code is contributed by Pushpesh Raj |
The two strings are anagram of each other
Time Complexity: O(n)
Auxiliary space: O(1), because it is using constant space
Approach#5: Using dictionary
This approach uses a dictionary to store the frequency of each character in the first string. Then it traverses the second string and decrements the frequency of each character in the dictionary. Finally, it checks if all the values in the dictionary are zero, which indicates that both strings have the same characters with the same frequency. If any value in the dictionary is not zero, then the strings are not anagrams of each other.
Algorithm
1. Initialize an empty dictionary.
2. Traverse the first string and add each character to the dictionary with its frequency.
3. Traverse the second string and decrement the frequency of each character in the dictionary.
4. If all the values in the dictionary are zero, the strings are anagrams, otherwise they are not.
Python3
def are_anagrams_dict(str1, str2): # Initialize an empty dictionary dict = {} # Traverse the first string and add each character to the dictionary with its frequency for char in str1: if char in dict : dict [char] + = 1 else : dict [char] = 1 # Traverse the second string and decrement the frequency of each character in the dictionary for char in str2: if char in dict : dict [char] - = 1 else : return 'the two strings are not anagrams of each other' # Check if all the values in the dictionary are zero for value in dict .values(): if value ! = 0 : return 'the two strings are not anagrams of each other' return 'the two strings are anagrams of each other' str1 = "neveropen" str2 = "forneveropenneveropen" print (are_anagrams_dict(str1, str2)) |
the two strings are anagrams of each other
Time Complexity: O(n) where n is the length of the strings.
Auxiliary Space: O(n) where n is the length of the strings.
Please suggest if someone has a better solution which is more efficient in terms of space and time.
This article is contributed by Aarti_Rathi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Please refer complete article on Check whether two strings are anagram of each other for more details!
Approach#6: Using defaultdict+lambda
This approach is to create a lambda function that takes two strings and checks if each character in both strings appears the same number of times using the count() function. The lambda function returns True if all characters appear the same number of times and False otherwise. The set() function is used to create a set of all characters in both strings to avoid checking the same character multiple times.
Algorithm
1. Import defaultdict module from collections
2. Initialize two strings str1 and str2
3. Create a lambda function called “is_anagram” that takes two string arguments s1 and s2
4. In the lambda function, use the all() function to check if each character in both strings appears the same number of times using the count() function
5. The lambda function returns True if all characters appear the same number of times and False otherwise
6. Create two strings str1 and str2 to test the lambda function
7. Call the lambda function with str1 and str2 as arguments and print the result
Python3
from collections import defaultdict str1 = "neveropen" str2 = "forneveropenneveropen" is_anagram = lambda s1, s2: all (s1.count(c) = = s2.count(c) for c in set (s1 + s2)) if is_anagram(str1, str2): print ( "The two strings are anagrams of each other" ) else : print ( "The two strings are not anagrams of each other" ) |
The two strings are anagrams of each other
Time Complexity: O(n), where n is the length of the strings str1 and str2. This is because the lambda function iterates through each character in both strings and performs a constant time operation to check if each character appears the same number of times.
Auxiliary Space: O(n), where n is the length of the strings str1 and str2. This is because the lambda function creates a set of all characters in both strings, which can have a maximum size of 2n. Additionally, the lambda function creates two variables, s1 and s2, each of which can have a maximum size of n. Overall, the space complexity is dominated by the size of the input strings.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!