Using Counter() in Python to find minimum character removal to make two strings anagram

Given two strings in lowercase, the task is to make them Anagram. The only allowed operation is to remove a character from any string. Find minimum number of characters to be deleted to make both the strings anagram?
If two strings contains same data set in any order then strings are called Anagrams.

Examples:

Input : str1 = "bcadeh" str2 = "hea"
Output: 3
We need to remove b, c and d from str1.

Input : str1 = "cddgk" str2 = "gcd"
Output: 2

Input : str1 = "bca" str2 = "acb"
Output: 0

This problem has existing solution please refer Remove minimum number of characters so that two strings become anagram link. We will solve this problem in python quickly using Counter() and Dictionary Data Structure and intersection property of Set data structure. Approach is very simple,

  1. Convert each string into a dictionary data structure using Counter(iterable) method.
  2. Count number of keys in both dictionaries ( count1, count2) and count number of keys common in both dictionaries.
  3. If no common keys found that means we need to remove count1 + count2 characters from both the strings.
  4. Else (max(count1, count2) – countCommon) will be the number of characters to be removed
    1. filter_none

      edit
      close

      play_arrow

      link
      brightness_4
      code

      # Function remove minimum number of characters so that 
      # two strings become anagram
      from collections import Counter
      def removeChars(str1, str2):
        
           # make dictionaries from both strings
           dict1 = Counter(str1)
           dict2 = Counter(str2)
        
           # extract keys from dict1 and dict2
           keys1 = dict1.keys()
           keys2 = dict2.keys()
        
           # count number of keys in both lists of keys
           count1 = len(keys1)
           count2 = len(keys2)
        
           # convert list of keys in set to find common keys 
           set1 = set(keys1)
           commonKeys = len(set1.intersection(keys2))
        
           if (commonKeys == 0):
              return count1 + count2
           else:
              return (max(count1, count2)-commonKeys)
        
      # Driver program
      if __name__ == "__main__":
          str1 ='bcadeh' 
          str2 ='hea'
          print removeChars(str1, str2)

      chevron_right

      
      

      Output:

      3
      


      My Personal Notes arrow_drop_up

      Experienced Software Engineer with a demonstrated history of working in the information technology and services industry Skilled in Big Data technologies, Data Structures, Algorithm, Software Development, App Development, Databases, Python, Java, C, and WordPress

      If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

      Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




      Article Tags :
      Practice Tags :


      1


      Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.