Periksa apakah String adalah Palindrome di Java

1. Pengenalan

Dalam artikel ini, kita akan melihat bagaimana kita dapat memeriksa apakah String yang diberikan adalah palindrome menggunakan Java.

Palindrome adalah kata, frasa, nombor, atau urutan watak lain yang berbunyi sama ke belakang seperti depan , seperti "madam" atau "racecar".

2. Penyelesaian

Pada bahagian berikut, kita akan melihat pelbagai cara untuk memeriksa sama ada String yang diberikan adalah palindrome atau tidak.

2.1. Pendekatan Mudah

Kita secara serentak dapat memulakan iterasi rentetan yang diberikan ke depan dan ke belakang, satu watak pada satu masa. Sekiranya ada perlawanan, gelung akan berterusan; jika tidak, gelung keluar:

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. Membalikkan Rentetan

Terdapat beberapa pelaksanaan yang berbeza yang sesuai dengan kes penggunaan ini: kita boleh menggunakan kaedah API dari StringBuilder dan StringBuffer kelas apabila menyemak palindromes, atau kita boleh membalikkan String tanpa kelas ini.

Mari lihat implementasi kod tanpa API penolong terlebih dahulu:

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

Dalam coretan di atas, kami hanya mengulangi String yang diberikan dari watak terakhir dan menambahkan setiap watak ke watak berikutnya, hingga watak pertama sehingga membalikkan String yang diberikan .

Akhirnya, kami menguji kesamaan antara String yang diberikan dan String terbalik .

Perilaku yang sama dapat dicapai dengan menggunakan kaedah API.

Mari lihat demonstrasi ringkas:

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

Dalam coretan kod, kami menggunakan kaedah terbalik () dari StringBuilder dan StringBuffer API untuk membalikkan String yang diberikan dan menguji kesamaan.

2.3. Menggunakan Stream API

Kami juga dapat menggunakan IntStream untuk memberikan penyelesaian:

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

Dalam coretan di atas, kami mengesahkan bahawa tidak ada pasangan watak dari setiap hujung rentetan yang memenuhi syarat Predikat .

2.4. Menggunakan Rekursi

Rekursi adalah kaedah yang sangat popular untuk menyelesaikan masalah seperti ini. Dalam contoh yang ditunjukkan, kami berulang kali melakukan String dan ujian yang diberikan untuk mengetahui sama ada palindrome atau tidak:

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

Dalam tutorial ringkas ini, kami melihat bagaimana untuk mengetahui sama ada String yang diberikan adalah palindrome atau tidak.

Seperti biasa, contoh kod untuk artikel ini terdapat di GitHub.