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:

Reinvent your career. Join DEV.

It takes one minute and is worth it for your career.

Get started

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

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay