Controlla se una stringa è un palindromo in Java

1. Introduzione

In questo articolo, vedremo come possiamo verificare se una data stringa è un palindromo usando Java.

Un palindromo è una parola, una frase, un numero o altre sequenze di caratteri che si leggono all'indietro come in avanti , come "signora" o "macchina da corsa".

2. Soluzioni

Nelle sezioni seguenti, esamineremo i vari modi per verificare se una data stringa è un palindromo o meno.

2.1. Un approccio semplice

Possiamo simultaneamente iniziare a iterare la stringa data avanti e indietro, un carattere alla volta. Se c'è una corrispondenza il ciclo continua; in caso contrario, il ciclo termina:

public boolean isPalindrome(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); int length = clean.length(); int forward = 0; int backward = length - 1; while (backward > forward) { char forwardChar = clean.charAt(forward++); char backwardChar = clean.charAt(backward--); if (forwardChar != backwardChar) return false; } return true; }

2.2. Inversione della stringa

Ci sono alcune implementazioni differenti che si adattano a questo caso d'uso: possiamo usare i metodi API delle classi StringBuilder e StringBuffer quando controlliamo i palindromi, oppure possiamo invertire la String senza queste classi.

Diamo prima un'occhiata alle implementazioni del codice senza le API di supporto:

public boolean isPalindromeReverseTheString(String text) { StringBuilder reverse = new StringBuilder(); String clean = text.replaceAll("\\s+", "").toLowerCase(); char[] plain = clean.toCharArray(); for (int i = plain.length - 1; i >= 0; i--) { reverse.append(plain[i]); } return (reverse.toString()).equals(clean); }

Nello snippet sopra, iteriamo semplicemente la stringa data dall'ultimo carattere e aggiungiamo ogni carattere al carattere successivo, fino al primo carattere, invertendo così la stringa data .

Infine, testiamo l'uguaglianza tra la stringa data e la stringa invertita .

Lo stesso comportamento potrebbe essere ottenuto utilizzando metodi API.

Vediamo una rapida dimostrazione:

public boolean isPalindromeUsingStringBuilder(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); StringBuilder plain = new StringBuilder(clean); StringBuilder reverse = plain.reverse(); return (reverse.toString()).equals(clean); } public boolean isPalindromeUsingStringBuffer(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); StringBuffer plain = new StringBuffer(clean); StringBuffer reverse = plain.reverse(); return (reverse.toString()).equals(clean); }

Nello snippet di codice, invochiamo il metodo reverse () da StringBuilder e StringBuffer API per invertire la stringa data e testare l'uguaglianza.

2.3. Utilizzando Stream API

Possiamo anche usare un IntStream per fornire una soluzione:

public boolean isPalindromeUsingIntStream(String text) { String temp = text.replaceAll("\\s+", "").toLowerCase(); return IntStream.range(0, temp.length() / 2) .noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1)); }

Nello snippet precedente, verifichiamo che nessuna delle coppie di caratteri da ciascuna estremità della stringa soddisfi la condizione del predicato .

2.4. Utilizzo della ricorsione

La ricorsione è un metodo molto popolare per risolvere questo tipo di problemi. Nell'esempio dimostrato iteriamo ricorsivamente la stringa data e testiamo per scoprire se si tratta di un palindromo o meno:

public boolean isPalindromeRecursive(String text){ String clean = text.replaceAll("\\s+", "").toLowerCase(); return recursivePalindrome(clean,0,clean.length()-1); } private boolean recursivePalindrome(String text, int forward, int backward) { if (forward == backward) { return true; } if ((text.charAt(forward)) != (text.charAt(backward))) { return false; } if (forward < backward + 1) { return recursivePalindrome(text, forward + 1, backward - 1); } return true; }

3. Conclusione

In questo rapido tutorial, abbiamo visto come scoprire se una data stringa è un palindromo o meno.

Come sempre, gli esempi di codice per questo articolo sono disponibili su GitHub.