DEV Community

Beatriz Maciel
Beatriz Maciel

Posted on • Edited on

2 1

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:

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (0)

Great read:

Is it Time to go Back to the Monolith?

History repeats itself. Everything old is new again and I’ve been around long enough to see ideas discarded, rediscovered and return triumphantly to overtake the fad. In recent years SQL has made a tremendous comeback from the dead. We love relational databases all over again. I think the Monolith will have its space odyssey moment again. Microservices and serverless are trends pushed by the cloud vendors, designed to sell us more cloud computing resources.

Microservices make very little sense financially for most use cases. Yes, they can ramp down. But when they scale up, they pay the costs in dividends. The increased observability costs alone line the pockets of the “big cloud” vendors.

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay