1. 程式人生 > >最長迴文子串(Longest Palindromic Substring)——三種時間複雜度的解法

最長迴文子串(Longest Palindromic Substring)——三種時間複雜度的解法

public String longestPalindrome(String s) {
        List<Character> s_new = new ArrayList<>();
        for(int i = 0;i < s.length();i++){
            s_new.add('#');
            s_new.add(s.charAt(i));
        }
        s_new.add('#');
        List<Integer> Len = new ArrayList<>();
        String sub = "";//最長迴文子串
        int sub_midd = 0;//表示在i之前所得到的Len陣列中的最大值所在位置
        int sub_side = 0;//表示以sub_midd為中心的最長迴文子串的最右端在S_new中的位置
        Len.add(1);
        for(int i = 1;i < s_new.size();i++){
            if(i < sub_side) {//i < sub_side時,在Len[j]和sub_side - i中取最小值,省去了j的判斷
                int j = 2 * sub_midd - i;
                if(j >= 2 * sub_midd - sub_side &&  Len.get(j) <= sub_side - i){
                    Len.add(Len.get(j));
                }
                else
                    Len.add(sub_side - i + 1);
            }
            else//i >= sub_side時,從頭開始匹配
                Len.add(1);
            while( (i - Len.get(i) >= 0 && i + Len.get(i) < s_new.size()) && (s_new.get(i - Len.get(i)) == s_new.get(i + Len.get(i))))
                Len.set(i,Len.get(i) + 1);//s_new[i]兩端開始擴充套件匹配,直到匹配失敗時停止
            if(Len.get(i) >= Len.get(sub_midd)){//匹配的新迴文子串長度大於原有的長度
                sub_side = Len.get(i) + i - 1;
                sub_midd = i;
            }
        }
        sub = s.substring((2*sub_midd - sub_side)/2,sub_side /2);//在s中找到最長迴文子串的位置
        return sub;

相關推薦

Longest Palindromic Substring——時間複雜解法

public String longestPalindrome(String s) {        List<Character> s_new = new ArrayList<>();        for(int i = 0;i < s.length();i++){     

Longest Palindromic Substring

題目描述: 給出一個字串(假設長度最長為1000),求出它的最長迴文子串,你可以假定只有一個滿足條件的最長迴文串。 樣例 給出字串 "abcdzdcab",它的最長迴文子串為 "cdzdc"。 挑戰 O(n2) 時間複雜度的演算法是可以接受的,如果你

字串Longest Palindromic Substring

Given a string S, find thelongest palindromic substring in S. You may assume that the maximumlength ofS is 1000, and there exists one uni

leetcode演算法題—golang—題5

題目:最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbb

leetcode 51

第一種就是從中間開始判斷,分為兩種情況,長度為奇數還是偶數,但是時間複雜度為O(n^2),程式碼如下 char* longestPalindrome(char* s) { int low,length,high,j,k; printf("%s\n",s); length=str

LeetCode 5. C、C++、python

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb

演算法題:C#實現

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb

LeetCode第五題:C語言

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: “babad” 輸出: “bab” 注意: "aba"也是一個有效答案。 示例 2: 輸入: “cbbd” 輸出: “bb” 解法一:暴力求解法 思想:

leetcode5. 動態規劃

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb" 解題思路: 採用動態規劃的

Manacher演算法------求Java)

最長迴文子串 對於一個字串,請設計一個高效演算法,計算其中最長迴文子串的長度。 給定字串A以及它的長度n,請返回最長迴文子串的長度。 測試樣例: "abc1234321ab",12 返回:7 public class Main {      public st

Manacher模板

該演算法就是處理一個字串中的最長迴文子串,在後綴陣列中看到過相對的解法,時間複雜度可以優化到o(n),但是相對程式碼量太大,而面對迴文串演算法有相對更簡單的方法,可以很簡單的處理出來,程式碼量小,時間也

多種解法

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest

Manacharo(n)

0. 問題定義最長迴文子串問題:給定一個字串,求它的最長迴文子串長度。如果一個字串正著讀和反著讀是一樣的,那它就是迴文串。下面是一些迴文串的例項:12321 a aba abba aaaa tattarrattat(牛津英語詞典中最長的迴文單詞)1. Brute-force

動態規劃和遞

給一個字串,找出它的最長的迴文子序列的長度。例如,如果給定的序列是“BBABCBCAB”,則輸出應該是7,“BABCBAB”是在它的最長迴文子序列。 “BBBBB”和“BBCBB”也都是該字串的迴文子序列,但不是最長的。注意和最長迴文子串的區別(參考:最長迴文串)!這

Leetcode#5. Longest Palindromic Substring:二解法

宣告:題目解法使用c++和Python兩種,重點側重在於解題思路和如何將c++程式碼轉換為python程式碼。 本題c++採用兩種方法解答,python用到了閉包的知識。 題目 Given a string s, find the longest pali

LeetCode-5. Longest Palindromic Substring

問題:給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 Example 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer

leetcode5:Longest Palindromic Substring

python版: class Solution: def longestPalindrome(self, s): """ :type s: str :rtype: str """ start = en

【HDU - 3068】Manacher演算法,馬拉車演算法求

題幹: 給出一個只由小寫英文字元a,b,c...y,z組成的字串S,求S中最長迴文串的長度.  迴文就是正反讀都是一樣的字串,如aba, abba等 Input 輸入有多組case,不超過120組,每組輸入為一行小寫英文字元a,b,c...y,z組成的字串S  兩

leetcode-5-(longest palindromic substring)-java

題目及測試 package pid005; /*最長迴文子串 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出:

【LeetCode】#5(Longest Palindromic Substring)

【LeetCode】#5最長迴文子串(Longest Palindromic Substring) 題目描述 給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。 示例 示例 1: 輸入: “babad” 輸出: “bab” 注意: “a