什么是中心擴散法?
中心擴散法,顧名思義就是以某一個位置為中心,向周圍擴散,直到滿足條件或到達邊界。
Leetcode 5.最長回文子串
題目描述:給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:輸入: "babad",輸出: "bab",注意: "aba" 也是一個有效答案。
示例 2:輸入: "cbbd",輸出: "bb"
解題思路:遍歷s,以每個char以及兩個char中點為中心,計算以此點為中心的最長回文串;
例如: 字符串abcba 共有5(字母) + 4(兩字母間) = 9個中心點;因此,長度為N的string共有2N-1個中心。我們的目標就是統計以這2N-1個點為中心的最長回文串s1,s2,..,s2N-1,並從中挑出全局最長回文串。保留最大長度回文串index,記為left和right;完成遍歷后返回以left和right為邊界的substring
public class Solution { public static void main(String[] args) { Solution solution = new Solution(); String s1 = "babad"; System.out.println(solution.longestPalindrome(s1)); String s2 = "cbbd"; System.out.println(solution.longestPalindrome(s2)); String s4 = ""; System.out.println(solution.longestPalindrome(s4)); String s3 = null; System.out.println(solution.longestPalindrome(s3)); } public String longestPalindrome(String s) { if(null == s) { return null; } char[] charArray = s.toCharArray(); int length = charArray.length; int left = 0, right = 0, longestLength = 0; String longestPalindromeStr = ""; for(int i=0; i<length; i++) {//以單個字符為中心擴散,則有n個中心(n是輸入字符串的長度) left = i; right = i; while(left >= 0 && right < length && charArray[left] == charArray[right]) { left--; right++;//cabad } if(right - left - 1 > longestLength) { longestLength = right - left - 1; longestPalindromeStr = s.substring(left + 1, right); } } for(int i=0; i<length-1; i++) {//以雙字符為中心擴散,則有n-1個中心(n是輸入字符串的長度) left = i; right = i+1; while(left >= 0 && right < length && charArray[left] == charArray[right]) { left--; right++; } if(right - left - 1 > longestLength) { longestLength = right - left - 1; longestPalindromeStr = s.substring(left + 1, right); } } return longestPalindromeStr; } }