給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: 「babad」
輸出: 「bab」
注意: 「aba」 也是乙個有效答案。
示例 2:
輸入: 「cbbd」
輸出: 「bb」
由於回文串的特點,左右對稱,所以考慮設定兩個指標分別指向起始位置和最後乙個字元的位置,開始匹配
具體做法:設定左指標和右指標
(1)固定左指標不動,右指標一直向左移動
只有當左指標的字元與右指標的字元相同時,才會向右移動
如果某一次匹配中,左指標沒有移動,則可以將這個子串捨棄(認為不是回文串)
(2)當左指標的位置》=右指標的位置時,演算法停止
為了避免遺漏的現象,設定兩個迴圈:
在寫方法(一)的程式時,卡主了,兩個迴圈不足以實現這個功能,三重迴圈不予考慮,肯定會超時。
此時,考慮不用字元來匹配,直接採用字串匹配,此時兩個迴圈可以實現上述功能:
等等,既然都有逆轉功能了,為什麼不直接逆轉整個字串,再用減法判斷字串逆轉前後是否相等呢?
這樣一來,整個程式可以大幅簡化只需設定兩個向量用於儲存當前回文串和之前找到的最長回文串
實際上,如何逆轉字串也是乙個問題,如果按照乙個乙個字元來賦值,那麼逆轉乙個字串的時間複雜度為:o(n
)o(n)
o(n)
這樣還是相當於乙個三重迴圈,可以新增一些條件來減少迴圈的次數
c++**如下:
class solution }}
} return s_len_max;
}};
執行效率:
不愧是三重迴圈,即使在我優化之後,效率還是「不負眾望」,未完待續
設定乙個向量dp[i][j]來表示當前字元子串s[i]…s[j]中,最長回文串的長度
i與j分別指向當前某個子串的首尾,判斷s[i]與s[j]是否相等:
(1)s[i]==s[j]
相等時可以認為回文串長度+2嗎?
不行,因為,我們並不知道dp[i + 1][j - 1]是不是乙個回文串
因此需要先判斷dp[i + 1][j - 1]是不是回文串
(2)s[i]!=s[j]
不相等時,可知s[i]…s[j]中最長的回文串應該在其長度減1的子串中,考慮:
使用上述兩種方法找到的回文串長度中,取較大者,就是s[i]…s[j]中最長的回文串的長度
d p[
i][j
]=ma
x(dp
[i+1
][j]
,dp[
i][j
−1])
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
dp[i][
j]=m
ax(d
p[i+
1][j
],dp
[i][
j−1]
) c++**如下:
class solution
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
if (dp[i][j] > len_max)
}} return s.substr(start, len_max);
}};
執行效率:
???為什麼反而更慢了
看了下解題方案,說是動態規劃也是o(n
2)o(n^2)
o(n2
)所以。。。。。
LeetCode5最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...
LeetCode 5 最長回文子串
問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...
leetcode5 最長回文子串
遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...