1. 程式人生 > >在一個字串中找出最長迴文串

在一個字串中找出最長迴文串

如何高效的在一個字串中找到最長的迴文串呢?下面我們根據程式碼來分析

   首先,迴文串有兩種,一種是字串的長度是偶數,另一種就是奇數。
   我們從字串第二個字元開始,同樣我們把當前起始字元叫做k
   先檢驗奇數長度的字串,對比該字元的前一個和後一個(k - 1 和 k + 1),一共三個字元(奇數個),如果前後字元相同則說明是迴文串,就把當前字元與儲存的迴文palindromic進行比較,如果長度比較長,就把palindromic替換。然後接著首指標繼續往前移動一格,後指標後移一格。繼續判斷,直到不是迴文,或者首和末兩者其中一個超過字串合法長度。
   奇數長度判斷完了,接著到偶數。偶數起始位置就是當前字元k和前一個字元(k - 1)。先判斷這兩個字元是否相等,如果相等,接著前後各移動一格,條件和奇數一樣。
   當以上兩個都判斷完了之後,k++。
public String longestPalindrome(String s) {
    // 如果回字符串長度小於2直接返回
    if(s.length() < 2) {
        return s;
    }
    // 記錄最長的迴文串
    String palindromic = "";
    int j, k;
    for(int i = 1; i < s.length(); i++) {
        if(s.length() - i <= palindromic.length() / 2) {
            break;
        }
        int sum = 1;
        // 奇數長度判斷
        for(j = i - 1, k = i + 1; j >= 0 && k < s.length(); j--, k++) {
            if(s.charAt(j) != s.charAt(k)) {
                break;
            }
            sum = sum + 2;
        }
        if(sum > palindromic.length()) {
            palindromic = s.substring(j + 1, k);
        }
        sum = 0;
        // 偶數長度判斷
        for(j = i - 1, k = i; j >= 0 && k < s.length(); j--, k++) {
            if(s.charAt(j) != s.charAt(k)) {
                break;
            }
            sum = sum + 2;
        }
        if(sum > palindromic.length()) {
            palindromic = s.substring(j + 1, k);
        }
    }
    return palindromic;
}