給定乙個字串s,找到s中最長的回文子串. 你可以假設 s 的最大長度為1000.
示例1
輸入: "示例2babad
"輸出:
"bab
"注意:
"aba
" 也是乙個有效答案。
輸入: "解法一: 暴力解法cbbd
"輸出: "bb
"
根據回文子串的定義,列舉所有長度大於等於2的子串,以此判斷它們是否是回文.在具體實現中,可以只針對大於「當前得到的最長回文子串長度」的子串進行回文子串.下面我們用暴力解法,列舉出所有的,但是時間超出了限制,但是還是將這種方式貼出來
import foundation //然後在leetcode上提交,但是時間超過了限制,給出的結果如下:想要匯入,否則string無substring方法
func longestpalindrome(_ s: string) ->string
if s.count == 1
var maxlen: int = 1
let range = nsrange(location: 0, length: 1
) let result = (s as
nsstring).substring(with: range)
var resultstr = result as
string
for i in
0..1}}
return
resultstr}//
判斷回文
func valid(_ s: string, left1: int, right1: int) ->bool
left = left + 1
right -= 1
}
return
true
}
解法二: 動態規劃
解法一的時間複雜度過高,在leetcode上並不能ac.下面有改進方法
首先我們定義p(i,j) 如下
接下來p( i , j ) = (p( i + 1, j - 1 )&& s[ i ] == s[ j ])
所以如果我們知道了p( i, j )的情況,不需要呼叫判斷回文串的函式了,只需要知道p( i + 1, j - 1 )的情況就可以了,這樣時間複雜度就會減少了o(n), 因此我們採取動態規劃的方案,用空間換取時間,把已經求出來的p(i, j)儲存起來.
如果s[i + 1, j -1]是回文串, 那麼只要s[i] == s[j] 就可以確定s[i, j]是回文串.
求長度為1和長度為2的p(i,j)時不能用上邊的公式,因為帶上去,發現越界,所以要分兩種情況考慮.
所以我們先初始化長度為1的回文串的p(i,j),利用上面的提出的公式,然後兩邊向外各擴充乙個字元,長度為3, 5的,所有的長度就求出來了.
同理, 初始化長度為2的回文串,利用公式,得到了長度為4, 6的所有偶數長度就都求出來了.
**如下:
class上面就是動態規劃方法,還會持續更新,希望大家關注!!!solution
boolean p = new
boolean
[length][length];
int maxlen = 0;
string maxpal = "";
for (int i = 1; i <= length; i++) //
遍歷所有的長度
for (int j = 0; j < length; j++)
}return
maxpal;
}}
動態規劃 最長回文子串
動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...
動態規劃 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...
最長回文子串 動態規劃
給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...