CodeGym /בלוג Java /Random-HE /תוכנית Java לבדיקת מחרוזת היא פלינדרום
John Squirrels
רָמָה
San Francisco

תוכנית Java לבדיקת מחרוזת היא פלינדרום

פורסם בקבוצה
לחלק מהבעיות בתכנות יש מעמד של בעיות קלאסיות. בדרך כלל, משימות כאלה קשורות למתמטיקה והן מאוד אוהבות לשאול סטודנטים התמחויות במדעי המחשב, כמו גם מחפשי עבודה בראיונות. הם טובים כי הם עוזרים להגדיר את החשיבה שלך בצורה די טובה של מתכנת, כמו גם לאמן אותה. אחת הבעיות הללו היא לבדוק אם מיתר הוא פלינדרום, ואנו הולכים לשקול זאת במאמר זה.

מהו פלינדרום ומדוע להיות מסוגל לחפש אותם

פלינדרום הוא מספר, צירוף אותיות, מילה או טקסט שנקרא אותו דבר בשני הכיוונים. לסיכום, פלינדרום יכול להיקרא כל קבוצת תווים שהיא סימטרית על האמצע שלו. המילה היא משורשים יווניים שמקורם במילה "ריצה לאחור" (פאלין הוא "שוב, חזרה", ודרומוס, "ריצה"). Palindrome בג'אווה פירושו זהה למשמעות הכללית. דוגמאות לפלינדרום:
  • 1881
  • aaqquqqaa
  • פּוֹפּ
  • צָהֳרַיִים
  • רָמָה
  • מסובב
  • חדר הכושר שלי
  • גברתי אני אדם
  • עכשיו, אדוני, מלחמה ניצחה!
1881 הוא מספר פלינדרום והאחרים הם מיתרי פלינדרום. במאמר זה, נסתכל על פלינדרומים המיוצגים כמחרוזות, אך אלגוריתמים מסוימים מתאימים למדי לסוגים אחרים של פלינדרומים בג'אווה. למה אולי תרצה לחפש פלינדרומים? למעשה, לעתים קרובות אנו לא צריכים לחפש פלינדרום בחיי היומיום. זו סוג של משימה מאוד ספציפית. אם נזכור אלגוריתמי מחרוזת, לעתים קרובות יותר בפועל, מתכנתים יכולים למצוא חיפוש אחר תת-מחרוזת במחרוזת, ולא חיפוש אחר פלינדרומים או מספרם. עם זאת, לבעיות הקשורות לפלינדרום יש יישומים חשובים. הראשון הוא תכנות אולימפיאדה. יכולות להיות משימות לזיהוי פלינדרומים. האפליקציה השנייה שרלוונטית למתכנתים מתחילים היא ראיונות. בראיון טכני, בהחלט ייתכן שתתבקש לכתוב במהירות תוכנית כדי לבדוק אם מיתר הוא פלינדרום, אולי אפילו על פיסת נייר. ובכן, במדע, היישום המעשי ביותר של מציאת פלינדרומים הוא אלגוריתמים ביולוגיים. לפי ויקיפדיה, לפלינדרומיות של תרכובות ביולוגיות יש תפקיד חשוב בתכונותיהן של תרכובות ביולוגיות שונות.

דוגמה לקוד אלגוריתם פלינדרום

בוא נחשוב. מחרוזת היא רצף של תווים, אפשר לומר, מערך של תווים. זה יהיה הכי הגיוני לעקוב אחרי הרצף הזה משני הצדדים לאמצע ולהשוות בין הדמויות הקיצוניות. אם עד שנגיע לאמצע כל הדמויות שלנו יתאימו, אז יש לנו פלינדרום. בואו ניצור שיטה בוליאנית validPalindrome(String s) כדי לבדוק אם String הוא palindrome. קוד Java נמצא כאן:
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);


   }

}
בשיטה הראשית, אנו בודקים מחרוזות פלינדרום "רמה", "מגניב", "גברתי" ו"עכשיו, אדוני, מלחמה ניצחה!". כפי שאתה יכול לראות, הראשון, השלישי והרביעי הם פלינדרום, אבל השני לא. מה תיתן התוכנית?
האם הרמה היא פלינדרום? נכון זה מגניב פלינדרום? שקר האם גברתי היא פלינדרום? שקר הוא עכשיו, אדוני, מלחמה ניצחה! פלינדרום? שֶׁקֶר
אז, הראשון הוא פלינדרום, השני לא. עם זאת, מה רע בשלישית וברביעית? למה התוצאה שקרית ? בטח כבר ניחשתם שהנקודה היא שחלק מהתווים במחרוזת הזו הם אותיות רישיות וחלקם באותיות קטנות, ולג'אווה M ו-m הם שני תווים שונים. בואו נשפר את התוכנית כדי לקחת בחשבון את ההבדל הזה. הנה תוכנית לבדוק אם מיתר הוא פלינדרום הפותר בעיות באותיות גדולות וקטנות.
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);


   }

}
הפעם התוצאה צפויה לנו יותר:
האם הרמה היא פלינדרום? נכון זה מגניב פלינדרום? שקר האם גברתי היא פלינדרום? נכון הוא עכשיו, אדוני, מלחמה ניצחה! פלינדרום? שֶׁקֶר
ובכן... לא בדיוק צפוי. המצב עם "גברת" משתפר, אבל מה עם הפלינדרום הארוך והמאושר שלנו "עכשיו, אדוני, מלחמה ניצחה!". זה די קל, אם אתה זוכר שכל הרווחים וסמלי הפיסוק זהים לאותיות עבור Java. אז אנחנו צריכים לשפר שוב את האלגוריתם שלנו כדי לתקן את הפיקוח הזה. בואו נלמד את התוכנית שלנו להתעלם מרווחים וסימני פיסוק. במילים פשוטות, אנו מתעלמים מכל התווים שאינם אלפאנומריים. הנה תוכנית הפלינדרום המשופרת ב-Java.
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);


   }

}
לפחות התוצאה היא מה שציפינו ממנה:
האם הרמה היא פלינדרום? נכון זה מגניב פלינדרום? שקר האם גברתי היא פלינדרום? נכון הוא עכשיו, אדוני, מלחמה ניצחה! פלינדרום? נָכוֹן
אולי, אם אתה רק מתחיל לתכנת, קשה לך להבין כיצד פועלים אלגוריתמי חציית המיתרים וההשוואה. כמובן שעדיף להתמודד עם זה, אבל אתה יכול לכתוב גרסה פשוטה של ​​עצם המעבר דרך מערך הדמויות, שהוא למעשה מחרוזת. אתה יכול להשתמש בשיטת StringBuffer.reverse כדי לבדוק אם מחרוזת היא פלינדרום. בואו נעשה את הגרסה הפשוטה ביותר מבלי לבדוק אם יש סמלים לא אלפאנומריים ואותיות גדולות וקטנות.
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);


   }
}
התוצאה זהה לזו שבדוגמה הראשונה
האם הרמה היא פלינדרום? נכון זה מגניב פלינדרום? שקר האם גברתי היא פלינדרום? שקר הוא עכשיו, אדוני, מלחמה ניצחה! פלינדרום? שֶׁקֶר
אם תרצה, תוכל לשפר תוכנית זו כפי שעשינו בדוגמה הראשונה. כדי לחזק את מה שלמדת, אנו מציעים לך לצפות בשיעור וידאו מקורס Java שלנו
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION