DEV Community

Beatriz Maciel
Beatriz Maciel

Posted on • Updated on

HackerRank #28 | Anagrams | 🇧🇷

Este problema espera que consigamos, a partir de dois inputs, identificar se as strings recebidas são anagramas, ou seja, que contém as mesmas letras em ordens diferentes.
Para isso, seguimos o passo a passo:

  • Fazer o Scanner de duas strings.
  • Como os anagramas não são case sensitive, vamos recebê-las e imediatamente transformá-las em .toLowerCase() (poderia ser .toUpperCase() também, tanto faz)
  • Declaramos o int sum = 0 porque faremos a verificação a partir de uma soma, onde somente o resultado 0 designa um anagrama.
  • O primeiro critério é de que a palavra precisa conter caracteres de a a z. Para que a verificação aconteça, criamos um for que verifique cada posição de caracter. Fica assim:

for (char c = 'a'; c <= 'z'; c++){

Neste for também estamos criando a variável c.

  • Dentro deste for, criamos a verificação do segundo critério: checar caracter por caracter até o final da String. Para começar usamos a length da String a, mas poderíamos ter usado a length da String b, também. Fica assim:

for (int i=0; i < a.length(); i++) {

  • Agora sim, dentro desse segundo for, passaremos a verificação de caracter em caracter, de forma que na posição 0 ele identifique se existe a letra a. Se sim, soma 1 e passa para a posição 1, ainda procurando a letra a e assim até o final da String. Fazemos isso para a String a e para a String b.
                if (a.charAt(i) == c) {
                    sum++;
                }
                if (b.charAt(i) == c) {
                    sum--;
                }
Enter fullscreen mode Exit fullscreen mode
  • Se houver a letra a na mesma proporção nas duas Strings, o resultado da sum = 0 o que nos leva a sair das chaves do segundo for (for (int i=0; i<a.length(); i++)) e entrar em um booleano:
            if (sum != 0) {
                return false;
            }
        }
        return true;
    }
Enter fullscreen mode Exit fullscreen mode

Enquanto o a.length não tiver terminado, continuamos nesse segundo for, verificando a existência de cada letra do alfabeto em cada posição. Quando acaba, retornamos true (o que quer dizer que, sim, as duas palavras são anagramas!)

=========

O resultado final é:



    static boolean isAnagram(String a, String b) {

        if (a.length() != b.length()) {
            return false;
        }

        a = a.toLowerCase();
        b = b.toLowerCase();
        int sum = 0;
        for (char c = 'a'; c <= 'z'; c++) {
            for (int i=0; i<a.length(); i++) {
                if (a.charAt(i) == c) {
                    sum++;
                }
                if (b.charAt(i) == c) {
                    sum--;
                }
            }
            if (sum != 0) {
                return false;
            }
        }
        return true;
    }
Enter fullscreen mode Exit fullscreen mode

Ufa!

=========

Referências

Discussão : HackerRank

============

Essa publicação faz parte de uma série de exercícios resolvidos em Java no HackerRank. Acesse a série completa:

Discussion (0)