Verificați dacă un șir este un palindrom în Java

1. Introducere

În acest articol, vom vedea cum putem verifica dacă un anumit șir este un palindrom folosind Java.

Un palindrom este un cuvânt, o frază, un număr sau alte secvențe de caractere care citește la fel ca înapoi ca înainte , cum ar fi „doamnă” sau „cursă de curse”.

2. Soluții

În secțiunile următoare, vom analiza diferitele moduri de a verifica dacă un șir dat este sau nu un palindrom.

2.1. O abordare simplă

Putem începe simultan să iterăm șirul dat înainte și înapoi, câte un caracter odată. Dacă există un meci, bucla continuă; în caz contrar, bucla iese:

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. Inversând șirul

Există câteva implementări diferite care se potrivesc acest caz de utilizare: putem face uz de metodele API din StringBuilder si StringBuffer clase atunci când se verifică palindroame, sau putem inversa String fără aceste clase.

Să aruncăm o privire mai întâi la implementările de cod fără API-urile de ajutor:

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); }

În fragmentul de mai sus, iterăm pur și simplu șirul dat de la ultimul caracter și adăugăm fiecare caracter la următorul personaj, până la primul caracter inversând astfel șirul dat .

În cele din urmă, testăm pentru egalitatea dintre șirul dat și șirul inversat .

Același comportament ar putea fi realizat folosind metode API.

Să vedem o demonstrație rapidă:

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); }

În fragmentul de cod, invocăm metoda reverse () din StringBuilder și StringBuffer API pentru a inversa șirul dat și pentru a testa egalitatea.

2.3. Folosind API-ul Stream

De asemenea, putem folosi un IntStream pentru a oferi o soluție:

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)); }

În fragmentul de mai sus, verificăm că niciuna dintre perechile de caractere de la fiecare capăt al șirului nu îndeplinește condiția Predicat .

2.4. Utilizarea recursiunii

Recursivitatea este o metodă foarte populară pentru a rezolva aceste tipuri de probleme. În exemplul demonstrat, iterăm recursiv șirul dat și testăm pentru a afla dacă este un palindrom sau nu:

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. Concluzie

În acest tutorial rapid, am văzut cum să aflăm dacă un anumit șir este un palindrom sau nu.

Ca întotdeauna, exemplele de cod pentru acest articol sunt disponibile pe GitHub.