Usando Counter() en Python para encontrar la eliminación mínima de caracteres para hacer un anagrama de dos strings

Dadas dos strings en minúsculas, la tarea es convertirlas en Anagrama . La única operación permitida es eliminar un carácter de cualquier string. ¿Encontrar el número mínimo de caracteres que se eliminarán para hacer que ambas strings sean un anagrama? Si dos strings contienen el mismo conjunto de datos en cualquier orden, las strings se denominan Anagramas

Ejemplos :

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

Este problema tiene una solución existente, consulte Eliminar la cantidad mínima de caracteres para que dos strings se conviertan en un enlace de anagrama. Resolveremos este problema en python rápidamente usando Counter() y Dictionary Data Structure y la propiedad de intersección de Set data structure. El enfoque es muy simple,

  1. Convierta cada string en una estructura de datos de diccionario utilizando el método Counter (iterable) .
  2. Contar el número de claves en ambos diccionarios (contar1, contar2) y contar el número de claves comunes en ambos diccionarios.
  3. Si no se encuentran claves comunes, eso significa que debemos eliminar los caracteres count1 + count2 de ambas strings.
  4. De lo contrario (max(count1, count2) – countCommon) será la cantidad de caracteres que se eliminarán

Implementación:

Python3

# 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))
Producción

3

Solución alternativa: 

  1. Convierta cada string en una estructura de datos de diccionario utilizando el método Counter (iterable) .
  2. Encuentra los elementos comunes de ambos diccionarios
  3. Sume los valores del diccionario común para obtener el número total de elementos comunes.

Implementación:

Python3

# Function remove minimum number of characters so that
# two strings become anagram
from collections import Counter
def removeChars(a, b):
 
    # make dictionaries from both strings
    c1 = Counter(a)
    c2 = Counter(b)
     
    # finding the common elements from both dictionary
    common = c1&c2
    value = 0
 
    # adding up the key from common dictionary in order
    # to get the total number of common elements
    for key in common:
        value = value + common[key]
         
    # returning the number of elements to be
    # removed to form an anagram
    return (len(a)-2*value+ len(b))       
 
# Driver program
if __name__ == "__main__":
    str1 ='bcadeh'
    str2 ='hea'
    print (removeChars(str1, str2))
Producción

3

Publicación traducida automáticamente

Artículo escrito por Shashank Mishra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *