ตรวจสอบว่า String เป็น Palindrome ใน Java หรือไม่

1. บทนำ

ในบทความนี้เราจะมาดูกันว่าเราจะตรวจสอบได้อย่างไรว่าString ที่กำหนดเป็น palindrome โดยใช้ Java

Palindrome คือคำวลีหมายเลขหรือลำดับอื่น ๆ ของอักขระที่อ่านย้อนหลังเช่นเดียวกับไปข้างหน้าเช่น "madam" หรือ "racecar"

2. แนวทางแก้ไข

ในส่วนต่อไปนี้เราจะดูวิธีการต่างๆในการตรวจสอบว่าสตริงที่กำหนดเป็นพาลินโดรมหรือไม่

2.1. แนวทางง่ายๆ

เราสามารถเริ่มต้นการทำซ้ำสตริงที่กำหนดไปข้างหน้าและข้างหลังทีละอักขระได้ในเวลาเดียวกัน หากมีการจับคู่การวนซ้ำยังคงดำเนินต่อไป มิฉะนั้นลูปจะออกจาก:

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. การย้อนกลับสตริง

เราสามารถทำให้การใช้วิธีการ API จาก: มีการใช้งานที่แตกต่างกันไม่กี่ที่เหมาะสมกับการใช้กรณีนี้StringBuilderและStringBufferเราสามารถย้อนกลับชั้นเรียนเมื่อตรวจหา palindromes หรือสตริงโดยไม่ต้องเรียนเหล่านี้

มาดูการติดตั้งโค้ดโดยไม่มี API ตัวช่วยก่อน:

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

ในตัวอย่างด้านบนเราเพียงแค่วนสตริงที่กำหนดจากอักขระสุดท้ายและต่อท้ายอักขระแต่ละตัวเข้ากับอักขระถัดไปจนถึงอักขระตัวแรกซึ่งเป็นการย้อนกลับสตริงที่กำหนด

สุดท้ายเราทดสอบความเท่าเทียมกันระหว่างสตริงที่กำหนดและสตริงที่ย้อนกลับ

พฤติกรรมเดียวกันนี้สามารถทำได้โดยใช้เมธอด API

มาดูการสาธิตอย่างรวดเร็ว:

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

ในข้อมูลโค้ดเราเรียกใช้เมธอดreverse ()จากStringBuilderและStringBuffer API เพื่อย้อนกลับString ที่กำหนดและทดสอบความเท่าเทียมกัน

2.3. ใช้Stream API

นอกจากนี้เรายังสามารถใช้IntStreamเพื่อจัดหาโซลูชัน:

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

ในตัวอย่างด้านบนเราตรวจสอบว่าไม่มีคู่ของอักขระจากปลายแต่ละด้านของString ที่ตรงตามเงื่อนไขPredicate

2.4. การใช้การเรียกซ้ำ

การเรียกซ้ำเป็นวิธีที่นิยมมากในการแก้ปัญหาประเภทนี้ ในตัวอย่างแสดงให้เห็นว่าเราทำซ้ำString ที่กำหนดซ้ำและทดสอบเพื่อดูว่าเป็น Palindrome หรือไม่:

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. สรุป

ในบทช่วยสอนฉบับย่อนี้เราได้เห็นวิธีการค้นหาว่าสตริงที่กำหนดเป็นพาลินโดรมหรือไม่

เช่นเคยตัวอย่างโค้ดสำหรับบทความนี้มีอยู่ใน GitHub