CodeGym /Java Blog /Toto sisi /Java 程序檢查一個字符串是否為回文
John Squirrels
等級 41
San Francisco

Java 程序檢查一個字符串是否為回文

在 Toto sisi 群組發布
編程中的一些問題具有經典問題的地位。通常,此類任務與數學有關,他們非常喜歡詢問計算機科學專業的學生,以及面試時的求職者。它們很好,因為它們有助於以程序員的方式很好地建立你的思維,並訓練它。其中一個問題是檢查字符串是否為回文,我們將在本文中考慮它。

什麼是回文以及為什麼能夠找到它們

回文是一個數字、字母組合、單詞或文本,在兩個方向上讀起來都一樣。總而言之,回文可以稱為任何關於其中心對稱的字符集。這個詞源自希臘詞根,字面意思是“跑回去”(palin 是“再次,回來”,dromos 是“跑”)。回文在Java中的含義與一般含義相同。回文的例子:
  • 1881年
  • 啊啊啊啊
  • 流行音樂
  • 中午
  • 等級
  • 旋轉器
  • 我的健身房
  • 女士我是亞當
  • 現在,先生,戰爭勝利了!
1881是回文數,其他都是回文串。在本文中,我們將研究表示為字符串的回文,但某些算法非常適用於 Java 中的其他類型的回文。你為什麼要尋找回文?事實上,我們在日常生活中並不需要經常去尋找回文。這是一項非常具體的任務。如果我們回想一下字符串算法,在實踐中更常見的是,程序員會發現搜索字符串中的子字符串,而不是搜索回文或它們的編號。然而,與回文相關的問題有重要的應用。首先是奧林匹克編程。可能有識別回文的任務。與新手程序員相關的第二個應用程序是面試。在一次技術面試中,你可能會被要求快速編寫一個程序來檢查一個字符串是否是回文,甚至可能是在一張紙上。好吧,在科學中,尋找回文最實際的應用是生物算法。根據維基百科,生物化合物的回文性對各種生物化合物的性質起著重要作用。

回文算法代碼示例

讓我們想想。字符串是一個字符序列,可以說是一個 char 數組。按照這個順序從兩邊到中間比較極端的字符是最合乎邏輯的。如果直到我們到達中間,我們所有的字符都會匹配,那麼我們就有了一個回文。讓我們創建一個布爾方法 validPalindrome(String s) 來檢查 String 是否為回文。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);


   }

}
在 main 方法中,我們檢查回文字符串“level”、“cool”、“Madam”和“Now, sir, a war is won!”。如您所見,第一個、第三個和第四個是回文,但第二個不是。該計劃將提供什麼?
水平是回文嗎?true 是 cool 回文嗎?false Madam 是回文嗎?false is 現在,長官,戰爭勝利了!回文?錯誤的
所以,第一個是回文,第二個不是。然而,第三個和第四個有什麼問題呢?為什麼結果是假的?你可能已經猜到重點是這個字符串中的一些字符是大寫的,一些是小寫的,對於 Java 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);


   }

}
這次結果對我們來說更可預測:
水平是回文嗎?true 是 cool 回文嗎?false Madam 是回文嗎?真的是現在,先生,戰爭勝利了!回文?錯誤的
好吧……不是完全可以預測的。“女士”的情況正在好轉,但我們漫長而快樂的回文“現在,先生,戰爭勝利了!”。如果您還記得所有空格和標點符號都與 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);


   }

}
至少結果是我們所期望的:
水平是回文嗎?true 是 cool 回文嗎?false Madam 是回文嗎?真的是現在,先生,戰爭勝利了!回文?真的
也許,如果你剛剛開始編程,你很難理解字符串遍歷和比較算法是如何工作的。當然,最好這樣處理,但是你可以通過字符數組寫一個簡化版的段落,它實際上是一個字符串。您可以使用 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);


   }
}
結果與第一個示例相同
水平是回文嗎?true 是 cool 回文嗎?false Madam 是回文嗎?false is 現在,長官,戰爭勝利了!回文?錯誤的
如果你願意,你可以改進這個程序,就像我們對第一個例子所做的那樣。 為了鞏固您所學的知識,我們建議您觀看我們的 Java 課程中的視頻課程
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION