Open In App

Python Program To Check Whether Two Strings Are Anagram Of Each Other

Improve
Improve
Like Article
Like
Save
Share
Report

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.

check-whether-two-strings-are-anagram-of-each-other

We strongly recommend that you click here and practice it, before moving on to the solution.

Method 1 (Use Sorting):

  1. Sort both strings
  2. Compare the sorted strings

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 = "geeksforgeeks"
str2 = "forgeeksgeeks"
 
# 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


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. 

  1. Create count arrays of size 256 for both strings. Initialize all values in count arrays as 0.
  2. Iterate through every character of both strings and increment the count of character in the corresponding count arrays.
  3. Compare count arrays. If both count arrays are same, then return true.

Below is the implementation of the above idea:

Python





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




# 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="geeksforgeeks"
str2="forgeeksgeeks"
 
# 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


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.

Python3





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
Previous
Next
Share your thoughts in the comments
Similar Reads