LeetCode05 最長回文陣列

2021-09-26 14:38:04 字數 1386 閱讀 4070

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例1:

輸入: 「babad」

輸出: 「bab」

注意: 「aba」 也是乙個有效答案。

示例2:

輸入: 「cbbd」

輸出: "bb「

在完成演算法的程式設計時,設計演算法是至關重要的,雖然來自數理系,但是自己在編寫演算法時還是不能設計出時間複雜度比較小的方案,在網上了解到「manacher演算法」的時間複雜度達到了o(n),由於學習起來比較困難,我將其簡化,時間複雜度為o(n*n)。下面通過舉例子來解釋:

eg.找出「aababbaa」的最長回文陣列

解:(先來個大致介紹) 本文採用的演算法其實是尋找乙個中心點然後依次比較其左右兩邊的元素,直到發現左右兩邊的元素不相同為止時,得到的陣列就是乙個回文陣列。

缺點:1.中心點的選取是依次選取,並沒有採取優化 2.不能識別偶回文陣列,形如「abba」

針對以上兩個缺點,其實第二個是可以規避的,我們只需要在陣列中加入肯定不會出現的元素,在這裡我們加入「#」:

news: #a#a#b#a#b#b#a#a# (長度為2s.length+1)

然後引入陣列len[2s.length+1],其中len[i]儲存的元素是news中以第i個元素為中心的最長回文陣列的半徑+1,即:

news: #a#a#b#a#b#b#a#a# (長度為2*s.length+1)

len : 12321414141252121

那麼問題來了,len中的元素要怎麼算?簡單,設要求的回文陣列左端點為left,右端點為right,right從中心元素news[i]右面第一開始取,即初始時right=i+1,此時left=right-2i。然後判斷news[left]與news[right]是否相同,若相同right+1,left也相應改變,直到news[left]與news[right]不相等為止。

public class solution

if(s.length==1)

//構造news

int lens=s.length;

int newlen=2*lens+1;

char news=new char [newlen];

for(int i=0;i=0&&rightlen[i]?index:i;

}//返回最長回文子串本串

string maxlong="";

for(int i=index+1-len[index];i執行用時 :172 ms, 在所有 c# 提交中擊敗了64.53%的使用者

記憶體消耗 :25 mb, 在所有 c#提交中擊敗了16.30%的使用者

leetcode05最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。看到一道題沒什麼思路,首推 無腦暴力,寫出來再說 public string longestpalindrome string s return s....

leetcode 05 最長回文子串

leetcode題目鏈結 題目要求 求最長回文子串。這題 我的第一思路是 從頭對每乙個節點進行遍歷 以當前節點向兩邊擴充套件,一直記錄 更新當前的最大長度。但是 奇數,偶數回文的不確定性 的問題沒有解決 奇偶不同情況統一 如果是偶數個,傳入 個相鄰節點的下標 如果是奇數個,傳入的 個引數相同 參考部...

Leetcode之 最長回文數

給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。回文串 對稱的字串 hash,首先統計字串中各個字元的出現次數,若為偶數則可進入回文串,若為奇數,則 1後可以進入回文串。若有奇數出現,則需要最後補乙個1作為...