數據結構與算法 -- 中心擴散法


 

什么是中心擴散法?

中心擴散法,顧名思義就是以某一個位置為中心,向周圍擴散,直到滿足條件或到達邊界。

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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM