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 duasstrings
. - 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 resultado0
designa um anagrama. - O primeiro critério é de que a palavra precisa conter caracteres de
a
az
. Para que a verificação aconteça, criamos umfor
que verifique cada posição de caracter. Fica assim:
for (char c = 'a'; c <= 'z'; c++){
Neste
for
também estamos criando a variávelc
.
- Dentro deste
for
, criamos a verificação do segundo critério: checar caracter por caracter até o final daString
. Para começar usamos alength
daString a
, mas poderÃamos ter usado alength
daString 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ção0
ele identifique se existe a letraa
. Se sim, soma 1 e passa para a posição 1, ainda procurando a letraa
e assim até o final daString
. Fazemos isso para aString a
e para aString b
.
if (a.charAt(i) == c) {
sum++;
}
if (b.charAt(i) == c) {
sum--;
}
- Se houver a letra
a
na mesma proporção nas duas Strings, o resultado dasum = 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;
}
Enquanto o
a.length
não tiver terminado, continuamos nesse segundofor
, verificando a existência de cada letra do alfabeto em cada posição. Quando acaba, retornamostrue
(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;
}
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:
- HackerRank #6 | Scanner e End-of-file
- HackerRank #7 | Int to String / String to Int
- HackerRank #8 | Date and Time
- HackerRank #9 | Static Initializer Block
- HackerRank #10 | Currency Formatter
- HackerRank #11 | DataTypes
- HackerRank #12 | Strings Introduction
- HackerRank #13 | Substring Comparisons
- HackerRank #14 | Abstract Class
- HackerRank #18 | BigInteger
- HackerRank #19 | Loops II
- HackerRank #20 | String Reverse
- HackerRank #23 | Instanceof keyword
- HackerRank #26 | Generics
- HackerRank #27 | 1D Array
- HackerRank #28 | Anagrams
- HackerRank #33 | Arraylist
- HackerRank #34 | Exception Handling Try / Catch
- HackerRank #36 | Exception Handling
- HackerRank #37 | List
- HackerRank #38 | SubArray
- HackerRank #39 | HashSet
- HackerRank #40 | Java Dequeue
Top comments (0)