[Java] 判斷字串是否為回文

回文是正著讀、反著讀都相同,如:

Mom、Dad、Bob

思路與過程

建立方法接收參數並返回結果

public boolean isPalindrome(String string) {
    return true;
}

首先要對傳入參數做 null check

if (string == null || string.length() == 0) {
    return false;
}

將字串拆分成每個字並轉為大寫
以利後續對比

String[] letters = string.toUpperCase().split("");

使用迴圈頭尾兩兩相比
不一致就返回 false

for (int first = 0, last = letters.length - 1;
     first < string.length() / 2;
     first++, last--) {

    if (!letters[first].equals(letters[last])) {
        return false;
    }
}

將長度要除二,避免重複比較

完整程式碼

public boolean isPalindrome(String string) {
    if (string == null || string.length() == 0) {
        return false;
    }
    
    String[] letters = string.toUpperCase().split("");
    
    for (int first = 0, last = letters.length - 1;
            first < string.length() / 2;
            first++, last--) {
        
        if (!letters[first].equals(letters[last])) {
            return false;
        }
    }
    return true;
}

測試

System.out.println(isPalindrome("a")); //true
System.out.println(isPalindrome("aa")); //true
System.out.println(isPalindrome("aka")); //true
System.out.println(isPalindrome("Noon")); //true
System.out.println(isPalindrome("Radar")); //true
System.out.println(isPalindrome("Kayak")); //true
System.out.println(isPalindrome("Civic")); //true
System.out.println(isPalindrome("akasaka")); //true
System.out.println(isPalindrome("1221")); //true
System.out.println(isPalindrome("20211202")); //true
System.out.println(isPalindrome("トマト")); //true
System.out.println(isPalindrome("牙刷刷牙")); //true
System.out.println(isPalindrome("上海自來水來自海上")); //true
System.out.println(isPalindrome("ab")); //false
System.out.println(isPalindrome("abs")); //false
System.out.println(isPalindrome("Poof")); //false
System.out.println(isPalindrome("1922")); //false

注意:
如果判斷中文
可能會遇到罕見字問題

System.out.println(isPalindrome("冬冬")); //false
System.out.println(isPalindrome("𥚃𥚃")); //false

因為罕見字視為兩個字
相當於 ABAB
理所當然是 false

目前沒有解法