編程中的一些問題具有經典問題的地位。通常,此類任務與數學有關,他們非常喜歡詢問計算機科學專業的學生,以及面試時的求職者。它們很好,因為它們有助於以程序員的方式很好地建立你的思維,並訓練它。其中一個問題是檢查字符串是否為回文,我們將在本文中考慮它。
什麼是回文以及為什麼能夠找到它們
回文是一個數字、字母組合、單詞或文本,在兩個方向上讀起來都一樣。總而言之,回文可以稱為任何關於其中心對稱的字符集。這個詞源自希臘詞根,字面意思是“跑回去”(palin 是“再次,回來”,dromos 是“跑”)。回文在Java中的含義與一般含義相同。回文的例子:- 1881年
- 啊啊啊啊
- 流行音樂
- 中午
- 等級
- 旋轉器
- 我的健身房
- 女士我是亞當
- 現在,先生,戰爭勝利了!
回文算法代碼示例
讓我們想想。字符串是一個字符序列,可以說是一個 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 課程中的視頻課程
GO TO FULL VERSION