Algunos apuntes con códigos y breves descripciones de Java, Swift, PHP o SQL

HackerRank con Swift: Strings Making Anagrams

En el siguiente artículo se buscará desarrollar con lenguaje de programación swift el problema planteado en la pagina HackerRank

El ejercicio en cuestion se llama “Making Anagrams” y se encuentra en Practice >> Interview Preparation Kit >> String Manipulattion. El problema esta catalogado como fácil.

Como es costumbre, y antes de comenzar, el contexto del desarrollo y ejemplo es:

[blockquote] Sistema Operativo: macOS Catalina
Xcode 11.6
Lenguaje Swift
[/blockquote]

Continuando con el problema, la descripcion de este es:

hackerRank Strings Making Anagrams problem

Lo requerido, y las condiciones son:

hackerRank Strings Making Anagrams instruction

Desarrollo

Al igual que el ejemplo anterior Lo mas recomendable es tomar una hoja de papel y un lapiz, luego empezar a plantear el problema y desarrollar una solucion.

En un comienzo conté por cada vez que un carácter de “a” si se encontraba en “b”, pero esto tenía un problema: ¿Qué sucede cuando un mismo carácter esta “n” veces repetido?, entonces este mecanismo no sirvió.

Luego volví a dibujar en el papel el ciclo y vi la necesidad de trabajar con 2 arreglos que contengan cada letra de “a” y “b”. Con esto puedo recorrer cada palabra, obtener la letra de esa posición, comparar con el arreglo de la otra palabra y si existe, quitar del arreglo esa y sumar 1 al contador de coincidencias. 

Make Anagrams planteamiento

Finalmente procede la suma, la cual es el total de caracteres de “a” y “b” menos las coincidencias antes encontradas.

La solucion es la siguiente:

func makeAnagram(a: String, b: String) -> Int {

    var letraA = "", letraB = "", cont = 0, total = 0

    var arrB = Array(b)
    var arrA = Array(a)
    
    for i in 0 ..< (a.count){
        letraA = String(a[a.index(a.startIndex, offsetBy: i)])
        for x in 0 ..< arrB.count {
            if letraA == String(arrB[x]) {
                //print("Es igual \(letraA): \(arrB[x])")
                arrB.remove(at: x)
                cont += 1
                break //Romper el ciclo for y continuar con la siguiente letra
            }
        }
    }
    //print(arrB)
    //print(cont)


    for i in 0 ..< (b.count){
        letraB = String(b[b.index(b.startIndex, offsetBy: i)])
        for x in 0 ..< arrA.count {
            if letraB == String(arrA[x]) {
                //print("Es igual \(letraB): \(arrA[x])")
                arrA.remove(at: x)
                cont += 1
                break //Romper el ciclo for y continuar con la siguiente letra
            }
        }
    }
    //print(arrA)
    //print(cont)
    
    

    //print("sum A+B:" + String(a.count + (b.count)))
    total = Int(a.count) + Int(b.count) - Int(cont)
    print(total)
    return total
}

Conclusión

El ejercicio “Making Anagrams” si bien esta catalogado como fácil, realmente me llevo un buen rato.

Como mencioné, en un comienzo desarrollé un algoritmo que creí funcional, pero al ejecutar las pruebas me di cuenta de que no lo era; no estaba considerando las letras repetidas. 

Así son los ejercicios de esta página: entretenidos y con sorpresas…. aún tengo otros más resueltos.

Acerca del autor Nestor Cortes

Informático en aprendizaje constante, y siempre practicando la versatilidad en el mundo real. Experiencia en minería ,banca, y servicios tecnológicos. Desarrollo Java, Swift y PHP principalmente

Categorias: Swift
Tags: , ,
Link: .