在一個字串中找出最長迴文串
阿新 • • 發佈:2018-12-14
如何高效的在一個字串中找到最長的迴文串呢?下面我們根據程式碼來分析
首先,迴文串有兩種,一種是字串的長度是偶數,另一種就是奇數。 我們從字串第二個字元開始,同樣我們把當前起始字元叫做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; }