1   /**
2    * TIE120 Programming 2, Exam 17.3.2004, Question 2, Example solution.
3    * @author Heikki Kainulainen
4    * @version 1.0, 31.03.2004
5    */
6   public class Palindrome {
7   
8       /**
9        * Determines if the specified string is a palindrome.
10       * 
11       * <pre>
12       *  ALGORITMI:
13       *  1. Olkoon i merkkijonon ensimmäisen ja j merkkijonon viimeisen kirjaimen indeksi.
14       *  2. Jos i ei ole pienempi kuin j: Sana on palindromi. The End.
15       *  3. Olkoon c jonon i:s ja d jonon j:s merkki.
16       *  4. Jos c ei ole kirjain, kasvatetaan i:tä yhdellä ja palataan kohtaan 2.
17       *  5. Jos d ei ole kirjain, pienennetään j:tä yhdellä ja palataan kohtaan 2.
18       *  6. Muutetaan c ja d pieniksi kirjaimiksi.
19       *  7. Jos c ja d eivät ole sama kirjain: Sana ei ole palindromi. The End.
20       *  8. Kasvatetaan i:tä yhdellä, pienennetään j:tä yhdellä ja palataan kohtaan 2.
21       * </pre>
22       * 
23       * @param candidate
24       *            the string to be tested.
25       * @return <code>true</code> if the string is palindrome; <code>false</code>
26       *         otherwise.
27       */
28      public static boolean isPalindrome(String candidate) {
29          for (int i = 0, j = candidate.length() - 1; i < j;) {
30              char c = candidate.charAt(i);
31              char d = candidate.charAt(j);
32              if (!Character.isLetter(c)) {
33                  i++;
34                  continue;
35              }
36              if (!Character.isLetter(d)) {
37                  j--;
38                  continue;
39              }
40              if (Character.toLowerCase(c) != Character.toLowerCase(d)) {
41                  return false;
42              }
43              i++;
44              j--;
45          }
46          return true;
47      }
48  
49      /**
50       * Determines if the specified string is a palindrome. (Alternative
51       * implementation.)
52       * 
53       * @param candidate
54       *            the string to be tested.
55       * @return <code>true</code> if the string is palindrome; <code>false</code>
56       *         otherwise.
57       */
58      public static boolean isPalindrome2(String candidate) {
59          StringBuffer buffer = new StringBuffer();
60          for (int i = 0; i < candidate.length(); i++) {
61              char c = candidate.charAt(i);
62              if (Character.isLetter(c)) {
63                  buffer.append(c);
64              }
65          }
66          if (buffer.toString().equalsIgnoreCase(buffer.reverse().toString())) {
67              return true;
68          }
69          return false;
70      }
71  
72      public static void main(String[] args) {
73          String[] candidates = {
74                  "Taas alle satasella saat!",
75                  "Allia vaanii visio: jano-juomisia kai Simo ujona joisi viinaa vailla.",
76                  "Emmi! Sana ''myytti'' --- se vesittyy, manasimme!",
77                  "saippuakauppias", 
78                  "Tämä ei liene palindromi."
79          };
80          for (int i = 0; i < candidates.length; i++) {
81              String s = candidates[i];
82              System.out.println(isPalindrome(s) + ": '" + s + "'");
83              System.out.println(isPalindrome2(s) + ": '" + s + "'");
84          }
85      }
86  }
87