A programozás egyes problémái a klasszikus státuszúak. Az ilyen jellegű feladatok jellemzően a matematikához kötődnek, és nagyon szívesen kérdeznek interjúkon számítástechnika szakos hallgatókat, álláskeresőket. Azért jók, mert egész jól segítik a gondolkodásodat programozói módon felállítani, és edzeni is. Az egyik ilyen probléma annak ellenőrzése, hogy egy karakterlánc palindrom-e, és ebben a cikkben ezt fogjuk megvizsgálni.
Mi az a palindrom, és miért kell keresni őket
A palindrom olyan szám, betű kombináció, szó vagy szöveg, amely mindkét irányban ugyanazt olvassa. Összefoglalva, palindromnak nevezhető minden olyan karakterkészlet, amely szimmetrikus a közepére. A szó görög gyökerekből származik, amelyek szó szerint a „visszafutás” szóból származnak (palin jelentése „újra, vissza”, a dromos pedig „futás”. A palindrom a Java nyelven ugyanazt jelenti, mint az általános jelentésben. Példák palindromokra:- 1881
- aaqquqqaa
- pop
- Dél
- szint
- Rotátor
- Saját edzőterem
- Hölgyem Ádám vagyok
- Most, uram, megnyertük a háborút!
Példa a palindrom algoritmus kódjára
Gondolkozzunk. A karakterlánc karakterek sorozata, mondhatnánk, karakterek tömbje. Az lenne a leglogikusabb, ha ezt a sorrendet mindkét oldalról középre követnénk, és összehasonlítanánk az extrém karaktereket. Ha addig, amíg el nem érjük a közepét, minden karakterünk megegyezik, akkor palindromunk van. Hozzon létre egy logikai metódust validPalindrome(String s) annak ellenőrzésére, hogy a String palindrom-e. A Java kód itt található:
public class PalindromeTest1 {
//method to check if a string is palindrome
public static boolean validPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
}
return true;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!"
boolean b1 = validPalindrome(s1);
boolean b2 = validPalindrome(s2);
boolean b3 = validPalindrome(s3);
boolean b4 = validPalindrome(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
A fő módszerben a „level”, „cool”, „madam” és „Most, uram, megnyert egy háború!” palindromikus húrokat keresünk. Amint látja, az első, a harmadik és a negyedik palindrom, de a második nem. Mit fog adni a program?
a szint palindrom? igaz, menő palindrom? hamis Madam palindrom? hamis most, uram, megnyert egy háború! egy palindrom? hamis
Tehát az első palindrom, a második nem. De mi a baj a harmadikkal és a negyedikkel? Miért hamis az eredmény ? Valószínűleg már sejtette, hogy a lényeg az, hogy ebben a karakterláncban egyes karakterek nagybetűk, mások pedig kisbetűk, Java esetén pedig az M és az m két különböző karakter. Javítsuk a programot, hogy figyelembe vegyük ezt a különbséget. Íme egy program annak ellenőrzésére, hogy egy karakterlánc palindrom-e, amely megoldja a kis- és nagybetűs problémákat.
public class PalindromeTest2 {
//lowercase and uppercase characters should be treated the same:
public static boolean validPalindrome(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
return false;
}
return true;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!"
boolean b1 = validPalindrome(s1);
boolean b2 = validPalindrome(s2);
boolean b3 = validPalindrome(s3);
boolean b4 = validPalindrome(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
Ezúttal az eredmény kiszámíthatóbb számunkra:
a szint palindrom? igaz, menő palindrom? hamis Madam palindrom? igaz most, uram, a háború megnyert! egy palindrom? hamis
Hát… nem pontosan kiszámítható. „Asszonyom” helyzete egyre jobb, de mi van a hosszú és boldog palindromunkkal „Most, uram, megnyert egy háború!”. Ez nagyon egyszerű, ha emlékszel arra, hogy minden szóköz és írásjel megegyezik a Java betűivel. Tehát ismét javítanunk kell az algoritmusunkon, hogy kijavítsuk ezt a hibát. Tanítsuk meg programunkat a szóközök és írásjelek figyelmen kívül hagyására. Egyszerűen fogalmazva, figyelmen kívül hagyunk minden nem alfanumerikus karaktert. Itt van a továbbfejlesztett palindrom program Java nyelven.
public class PalindromeTest3 {
//in addition to the above, ignore all non alphanumeric chars like punctuation and spaces
private static boolean isAlphanumeric(char c) {
return Character.isAlphabetic(c) || Character.isDigit(c);
}
public static boolean validPalindromeIgnorePunctuation(String s) {
for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
// skip chars we should ignore
while (j >= 0 && !isAlphanumeric(s.charAt(j))) j--;
while (i < s.length() && !isAlphanumeric(s.charAt(i))) i++;
// overskipped -> nothing left to validate
if (i >= j) return true;
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j)))
return false;
}
return true;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!";
boolean b1 = validPalindromeIgnorePunctuation(s1);
boolean b2 = validPalindromeIgnorePunctuation(s2);
boolean b3 = validPalindromeIgnorePunctuation(s3);
boolean b4 = validPalindromeIgnorePunctuation(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
Az eredmény legalább az, amit vártunk tőle:
a szint palindrom? igaz, menő palindrom? hamis Madam palindrom? igaz most, uram, a háború megnyert! egy palindrom? igaz
Talán, ha most kezdi el a programozást, nehéz megértenie a karakterlánc-bejárási és összehasonlító algoritmusok működését. Természetesen jobb ezzel foglalkozni, de megírhatja a karaktertömbön keresztüli átjárás egyszerűsített változatát is, amely valójában egy karakterlánc. A StringBuffer.reverse metódussal ellenőrizheti, hogy egy karakterlánc palindrom-e. Végezzük el a legegyszerűbb verziót anélkül, hogy ellenőriznénk a nem alfanumerikus szimbólumokat, valamint a nagy- és kisbetűket.
public class PalindromeTest5 {
public static boolean validPalindrome(String s) {
StringBuffer buffer = new StringBuffer(s);
buffer.reverse();
String data = buffer.toString();
if (s.equals(data)) {
return true;
}
return false;
}
public static void main(String[] args) {
String s1 = "level";
String s2 = "cool";
String s3 = "Madam";
String s4 = "Now, sir, a war is won!";
boolean b1 = validPalindrome(s1);
boolean b2 = validPalindrome(s2);
boolean b3 = validPalindrome(s3);
boolean b4 = validPalindrome(s4);
System.out.println("is " + s1 + " a palindrome? " + b1);
System.out.println("is " + s2 + " a palindrome? " + b2);
System.out.println("is " + s3 + " a palindrome? " + b3);
System.out.println("is " + s4 + " a palindrome? " + b4);
}
}
Az eredmény ugyanaz, mint a legelső példában
a szint palindrom? igaz, menő palindrom? hamis Madam palindrom? hamis most, uram, megnyert egy háború! egy palindrom? hamis
Ha szeretné, fejlesztheti ezt a programot, ahogyan az első példában tettük. A tanultak megerősítése érdekében javasoljuk, hogy nézzen meg egy videóleckét a Java-tanfolyamról
GO TO FULL VERSION