Verifique se uma string contém todas as letras do alfabeto
1. Visão geral
Neste tutorial, veremos como verificar se uma String contém todas as letras do alfabeto ou não.
Aqui está um exemplo rápido: “Farmer jack realized that big yellow quilts were expensive.” - que na verdade contém todas as letras do alfabeto.
Discutiremos três abordagens.
Primeiro, vamos modelar o algoritmo usando uma abordagem imperativa. Em seguida, usará expressões regulares. E, finalmente, tiraremos vantagem de uma abordagem mais declarativa usando o Java 8.
Além disso, discutiremos a grande complexidade das abordagens adotadas.
2. Algoritmo imperativo
Vamos implementar um algoritmo imperativo. Para isso, primeiro, vamos criar um array booleano visitado. Em seguida, examinaremos a string de entrada caractere por caractere e marcaremos o caractere como visitado.
Observe queUppercaseeLowercase são considerados iguais. Portanto, o índice 0 representa A e a, da mesma forma, o índice 25 representa Z e z.
Por fim, verificaremos se todos os caracteres da matriz visitada estão configurados como verdadeiros:
public class EnglishAlphabetLetters {
public static boolean checkStringForAllTheLetters(String input) {
int index = 0;
boolean[] visited = new boolean[26];
for (int id = 0; id < input.length(); id++) {
if ('a' <= input.charAt(id) && input.charAt(id) <= 'z') {
index = input.charAt(id) - 'a';
} else if ('A' <= input.charAt(id) && input.charAt(id) <= 'Z') {
index = input.charAt(id) - 'A';
}
visited[index] = true;
}
for (int id = 0; id < 26; id++) {
if (!visited[id]) {
return false;
}
}
return true;
}
}
A grande complexidade deste programa é O (n) onden é o comprimento da string.
Observe que há muitas maneiras de otimizar o algoritmo, como remover letras de um conjunto e quebrar assim queSet estiver vazio. Para os fins do exercício, porém, esse algoritmo é bom o suficiente.
3. Usando expressão regular
Usando a expressão regular, podemos obter facilmente os mesmos resultados com algumas linhas de código:
public static boolean checkStringForAllLetterUsingRegex(String input) {
return input.toLowerCase()
.replaceAll("[^a-z]", "")
.replaceAll("(.)(?=.*\\1)", "")
.length() == 26;
}
Aqui, estamos eliminando primeiro todos os caracteres, exceto as letras do alfabeto, deinput. Em seguida, estamos removendo caracteres duplicados. Finalmente, estamos contando cartas e certificando-nos de que temos todas elas, 26.
Embora tenha menos desempenho, a Big-O-Complexity dessa abordagem também tende a O (n).
4. Java 8 Stream
Usando os recursos do Java 8, podemos alcançar facilmente o mesmo resultado de uma forma mais compacta e declarativa usando os métodosfilter anddistinct do Stream:
public static boolean checkStringForAllLetterUsingStream(String input) {
long c = input.toLowerCase().chars()
.filter(ch -> ch >= 'a' && ch <= 'z')
.distinct()
.count();
return c == 26;
}
A grande complexidade dessa abordagem também será O (n).
4. Teste
Vamos testar um caminho feliz para nosso algoritmo:
@Test
public void givenString_whenContainsAllCharacter_thenTrue() {
String sentence = "Farmer jack realized that big yellow quilts were expensive";
assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(sentence));
}
Aqui,sentence contém todas as letras do alfabeto, portanto, estamos esperandotrue como resultado.
5. Conclusão
Neste tutorial, abordamos como verificar se uma string contém todas as letras do alfabeto .
Vimos algumas maneiras de implementar isso primeiro usando programação imperativa tradicional, expressões regulares e fluxos Java 8.
O código-fonte completo está disponívelover on GitHub.