Python Program To Check Whether Two Strings Are Anagram Of Each Other
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.
Method 1 (Use Sorting):
- Sort both strings
- Compare the sorted strings
Below is the implementation of the above idea:
Python
NO_OF_CHARS = 256
def areAnagram(str1, str2):
count1 = [ 0 ] * NO_OF_CHARS
count2 = [ 0 ] * NO_OF_CHARS
for i in str1:
count1[ ord (i)] + = 1
for i in str2:
count2[ ord (i)] + = 1
if len (str1) ! = len (str2):
return 0
for i in xrange (NO_OF_CHARS):
if count1[i] ! = count2[i]:
return 0
return 1
str1 = "geeksforgeeks"
str2 = "forgeeksgeeks"
if areAnagram(str1, str2):
print ( "The two strings are anagram of each other" )
else :
print ( "The two strings are not anagram of each other" )
|
Output
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:
Output
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
NO_OF_CHARS = 256
def areAnagram(str1,str2):
count = [ 0 for i in range (NO_OF_CHARS)]
i = 0
for i in range ( len (str1)):
count[ ord (str1[i]) - ord ( 'a' )] + = 1 ;
count[ ord (str2[i]) - ord ( 'a' )] - = 1 ;
if ( len (str1) ! = len (str2)):
return False ;
for i in range (NO_OF_CHARS):
if (count[i] ! = 0 ):
return False
return True
str1 = "geeksforgeeks"
str2 = "forgeeksgeeks"
if (areAnagram(str1, str2)):
print (
"The two strings are anagram of each other" )
else :
print (
"The two strings are not anagram of each other" )
|
Output
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
from collections import defaultdict
str1 = "geeksforgeeks"
str2 = "forgeeksgeeks"
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" )
|
Output
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.
Output
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.
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 = "geeksforgeeks"
str2 = "forgeeksgeeks"
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" )
|
Output
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.
Last Updated :
17 May, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...