DEV Community

Beatriz Maciel
Beatriz Maciel

Posted on • Updated on

HackerRank #13 | Substring Comparisons | 🇧🇷

Esse problema pede dois inputs: uma string e um int. Essa string terá seus caracteres separados do tamanho do int que receber.

Exemplo de input:

estratosfera
2
Enter fullscreen mode Exit fullscreen mode

Os caracteres serão divididos pelo número de entrada (no caso acima, 2):
es tr at os fe ra

A partir desse input, e sabendo que devemos dividir os caracteres de acordo com o número de entrada, usaremos o .compareTo() para organizar as silabas em ordem alfanumérica.
O output deve ser organizado em dois resultados:

conjunto de caracteres de menor valor
conjunto de caracteres de maior valor
Enter fullscreen mode Exit fullscreen mode

Isso significa que primeiro receberemos a divisão que começa com a primeira letra possível do alfabeto (e, por isso, com o menor valor) e depois receberemos com a última letra possível do alfabeto. A palavra estratosfera seria organizada, pelo método .compareTo(), da seguinte forma:

at es fe os ra tr

Mas, como queremos apenar o conjunto de caracteres de menor e de maior valor, o output será:

at    //.. conjunto de caracteres de menor valor
tr    //.. conjunto de caracteres de maior valor
Enter fullscreen mode Exit fullscreen mode

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

O código começa assim:

import java.util.Scanner;

public class Solution {

    public static String getSmallestAndLargest(String s, int k) {
        String smallest = "";
        String largest = "";

        // Complete the function
        // 'smallest' must be the lexicographically smallest substring of length 'k'
        // 'largest' must be the lexicographically largest substring of length 'k'

        return smallest + "\n" + largest;
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.next();
        int k = scan.nextInt();
        scan.close();

        System.out.println(getSmallestAndLargest(s, k));
    }
}
Enter fullscreen mode Exit fullscreen mode

=========

O passo a passo consiste em:

  • Declarar que as variáveis smallest e largest começam em 0 e tem o tamanho de caracteres declarados pelo input k. Essa declaração é só para começar, porque será substituída posteriormente. Por isso as duas são iguais.
  • Declarar um int que começa em 0
  • Fazer um while que some a variável i com k (número de entrada no input)
  • Enquanto essa soma for menor ou do mesmo tamanho da string, fazer uma substring que comece em i (a partir de 0) e termine no número de input k + i. Se for menor do que 0, significa que o conjunto de caracteres é menor alfanumericamente.
  • Se o conjunto de caracteres for menor alfanumericamente, isso significa que vamos substituir o valor de smallest.
  • Se o conjunto de caracteres não for menor (e, portanto, não retornar um número negativo), vai para o segundo if. Se, na comparação, o conjunto de caracteres for maior do que o valor inicial declarado no largest, este conjunto substitui o valor anterior.
  • Por fim, somamos mais uma posição (i++) para dar cabo à iteração e ir comparando todos os conjuntos de caracteres até que termine as possibilidades de acordo com o tamanho (length) da String de input (s).

=========

Solução

        String smallest = s.substring(0,k);
        String largest = s.substring(0,k);
        int i = 0;

        while (i+k <= s.length()) {
            if(s.substring(i,i+k).compareTo(smallest) < 0 ) {
                smallest = s.substring(i,i+k);
            } else if (s.substring(i,i+k).compareTo(largest) > 0) {
                largest = s.substring(i,i+k);
            }
            i++;
        }
Enter fullscreen mode Exit fullscreen mode

=========

Referências

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

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

Discussion (0)