Kontrollera om en sträng är en palindrom i Java

1. Introduktion

I den här artikeln ska vi se hur vi kan kontrollera om en viss sträng är en palindrom med Java.

En palindrom är ett ord, fras, nummer eller andra sekvenser av tecken som läser samma bakåt som framåt , till exempel "fru" eller "racerbil".

2. Lösningar

I följande avsnitt tittar vi på olika sätt att kontrollera om en viss sträng är en palindrom eller inte.

2.1. En enkel strategi

Vi kan samtidigt börja itera den givna strängen framåt och bakåt, ett tecken i taget. Om det finns en match fortsätter slingan; annars går slingan:

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. Omvänd sträng

Det finns några olika implementeringar som passar detta användningsfall: vi kan använda API-metoderna från StringBuilder- och StringBuffer- klasser när vi söker efter palindromer, eller så kan vi vända strängen utan dessa klasser.

Låt oss ta en titt på kodimplementeringarna utan hjälp-API: erna först:

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

I ovanstående utdrag upprepar vi helt enkelt den givna strängen från den sista karaktären och lägger till varje tecken till nästa karaktär, hela vägen till det första tecknet och därigenom reverserar den givna strängen.

Slutligen testar vi för jämlikhet mellan den givna strängen och omvänd sträng.

Samma beteende kan uppnås med API-metoder.

Låt oss se en snabb demonstration:

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

I kodavsnittet åberopar vi reverse () -metoden från StringBuilder och StringBuffer API för att vända den givna strängen och testa för jämlikhet.

2.3. Använda Stream API

Vi kan också använda en IntStream för att tillhandahålla en lösning:

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

I kodavsnittet ovan verifierar vi att inget av parets tecken från vardera änden av strängen uppfyller förutsägelsen .

2.4. Använda rekursion

Rekursion är en mycket populär metod för att lösa denna typ av problem. I exemplet som visas demonstrerar vi rekursivt den givna strängen och testar för att ta reda på om det är en palindrom eller inte:

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

I den här snabbhandledningen såg vi hur man tar reda på om en viss sträng är en palindrom eller inte.

Som alltid finns kodexemplen för den här artikeln tillgängliga på GitHub.