3種解法 求解最長回文子串

2021-10-02 14:42:14 字數 1715 閱讀 8424

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

示例 1:

輸入: 「babad」

輸出: 「bab」

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

示例 2:

輸入: 「cbbd」

輸出: 「bb」

思路:原理就是對字串從前到後依次進行遍歷,最外層迴圈為子串頭,第二層迴圈為確定子串尾,第三層迴圈為確定子串是否滿足回文約束。

確定子串頭i,子串尾j

判斷子串是否滿足回文,並記錄最長回文子串

public

class

solution}if

(!flag && j-i > len)}}

return len >-1

?s.substring

(idx,len+1)

:"";}

}

思路:把每個字元作為回文串的中心點,向兩邊擴充套件進行檢測來確定當前字元為中心的回文串長度,所有子串的最大長度即為所求。

以字元為中心位置進行檢測是否滿足回文串

對所有字元進行遍歷

當子串為偶數和奇數時對應的順序不一致,本解法種分別對每個字元驗證偶數和奇數兩種情況,並保留最長串

public

class

solution

}//需要回溯乙個位置

m++; n--

; len = n - m;

idx = m;

}public

string

longestpalindrome

(string s)

//偶數,即中間是兩個相同的字元,或沒有乙個具體字元在中間

checkword

(s,i,i+1,

out tmpidx,

out tmplen);if

(tmplen > len)

}return len >-1

?s.substring

(idx,len+1)

:"";}

}

思路:可以當做基於暴力解法的一種優化,將已經得到的回文串儲存起來,用於求解新的回文串。對於乙個回文子串,如果兩邊的字母一樣,則可以分別向兩邊擴充套件一步形成新的回文串,如果兩邊字母不同,那當前串即為最長回文子串,直到找到最長的字元。

1個和2個字元屬於特殊情況需要特殊處理,1個字元都是回文串,2個字元如果相等就是回文串,如果不等就不是。

利用遞推公式:如果s[i

+1,j

−1

]s[i+1,j-1]

s[i+1,

j−1]

是回文,且s[i

]==s

[j

]s[i]==s[j]

s[i]==

s[j]

,那麼s[i

,j

]s[i,j]

s[i,j]

也是回文串

使用乙個二維陣列儲存之前記錄的回文串,陣列橫縱下標分別表示字元的起止索引是否為回文串,即t[i,j]=true表示s[i…j]是回文串

public

class

solution}}

}return len >-1

?s.substring

(idx,len+1)

:"";}

}

最長回文子串解法

沒咋麼過腦子,瞬間能想到的思路大概為 abcabcbb 比如這個字串 首先 宣告乙個陣列 裡面存放各種開分來的字串 切分條件是當這次迴圈的值 存在於當前的陣列中 像這樣abc bca cab abc bcb cb 最初的實現 var str 生成一些隨機字元 for var i 0 i 100000...

最長回文子串兩種解法

刷leetcode.給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路 遍歷每乙個字元,以字元為中心,將字串對折,如果對應的字元相等,則可以確認該字串為回文串...

最長回文子串 解法一

其實最最簡單的演算法,也是效率最低的應該就是列舉子串,不過在這裡沒有必要拿來寫 解法一是在列舉子串上優化的 我們用 a,b 來表示子串,即從位置a到位置b的子串 假設現在我們已經知道了子串 x,y 不是回文串,那麼 x 1,y 1 x 2,y 2 x n,y n 還有可能是回文串嗎?當然不可能!所以...