一、描述
回文的定義:"回文數" 就是正讀倒讀都一樣的整數。如奇數個數字:98789, 這個數字正讀是98789,倒讀也是98789;偶數個數字3223也是回文數。
我們今天將回文數擴展為字母和數字組合回文,如adgu6776ugda也是回文,我們采用三種方式判斷這種類型的字符串是否為回文:
1.調用StringBuffer類對象的reverse()方法,將字符串翻轉後與之前的字符串比較,如果相等則為回文,反之亦然;
2.采用low和high兩個變量分別對應字符串對稱位置的index,所有對稱位置的字符都相等則為回文,反之亦然;
3.使用一個變量i來表示字符串的下標,找出對稱位置的index關系來判斷字符串是否為回文。
二、源代碼
import java.util.Scanner;
import javax.swing.JOptionPane;
/**
* 回文描述:正著讀過去和倒著讀回來的字符串序列相同則為回文,如:1h3gkg3h1是回文
* @author tong
*
*/
public class PalindromeIgnoreNonAlphanumeric {
public static void main(String[] args) {
//可以使用javax.swing.JOptionPane類中的showInputDialog()方法提示用戶輸入字母或者數字串
String s = JOptionPane.showInputDialog("請輸入輸入字符串:");
//調用isPalindromeByBuffer()方法
String output = s + (isPalindromeByBuffer(s)?"是":"不是")+"回文。";
JOptionPane.showMessageDialog(null, output);
s = JOptionPane.showInputDialog("請輸入輸入字符串:");
//調用isPalindromeByCharAt()方法
output = s + (isPalindromeByCharAt(s)?"是":"不是")+"回文。";
JOptionPane.showMessageDialog(null, output);
//使用Scanner(System.in)方法提示用戶輸入字符串
System.out.println("請輸入輸入字符串:");
Scanner in=new Scanner(System.in);
String strOrigin=in.next();
//調用isPalindromeByCharAtSingle()方法
System.out.print(strOrigin + (isPalindromeByCharAtSingle(s)?"是":"不是")+"回文。");
}
/**
* 通過調用StringBuffer的對象的reverse()方法,來判斷翻轉前後字符串是否相等,確定是否為回文
* @param s
* @return
*/
public static boolean isPalindromeByBuffer(String s) {
String strOrigin = filterLetterAndDigit(s);
//將strOrigin作為輸入參數,構造一個StringBuffer對象
StringBuffer strBuf = new StringBuffer(strOrigin);
//調用StringBuffer對象自帶的reverse()方法進行字符串翻轉,最後調用toString()返回一個String類型字符串
String strAfterReverse = strBuf.reverse().toString();
//通過equals()方法判斷原來的字符串和翻轉後的字符串是否相等,來確定是否為回文
return strOrigin.equals(strAfterReverse);
}
/**
* 通過字符串中的對稱位置字符串是否相同來判斷是否為回文,這裡用了兩個變量low和high來分別對應字符串對稱位置的index
* @param s
* @return
*/
public static boolean isPalindromeByCharAt(String s) {
//low和high分別對應字符串對稱位置的index,以此來判斷所有對稱位置字符是否相同
int low = 0;
int high = s.length() - 1;
while (low < high) {
if (s.charAt(low) != s.charAt(high))
return false; // 不是回文
low++;
high--;
}
return true; // 是回文
}
/**
* 通過字符串中的對稱位置字符串是否相同來判斷是否為回文,這裡用了一個變量i來對應字符串對稱位置的index
* @param s
* @return
*/
public static boolean isPalindromeByCharAtSingle(String s) {
//通過對稱下標的關系使用一個變量即可判斷所有對稱位置字符是否相同
for(int i=0;i<s.length()/2;i++){
//只有當前一半字符串和後一半字符串對應位置相同,那麼才是回文,只有有一個對稱位置的字符不同就不是回文
if(s.charAt(i)!=s.charAt(s.length()-i-1)){
return false;
}
}
return true;
}
/**
* 通過調用Character.isLetterOrDigit(Char char)過濾字母或者數字,判斷字母或者數字的組合是否為回文
* @param s
* @return String
*/
public static String filterLetterAndDigit(String s) {
StringBuffer strBuf = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (Character.isLetterOrDigit(s.charAt(i))) {
//調用StringBuffer的append(Char char)方法,將輸入的字母或者數字加入其中
strBuf.append(s.charAt(i));
}
}
//返回String類型,需要將StringBuffer轉換為String,需要調用StringBuffer對象的toString()方法
return strBuf.toString();
}
}