給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入:
"babad"
輸出:"bab"
注意:"aba" 也是乙個有效答案。
示例 2:
輸入:
"cbbd"
輸出:"bb"
思路:
三種思路:
思路 1:
把每個字母當成回文串的中心
這裡要考慮兩種情況,回文串的長度為奇數或者偶數情況。
思路 2: 把每個字母當成回文串的結束
思路 3: 動態規劃
dp[j][i] 表示字串從 j 到 i 是否是為回文串,即當 s[j] == s[i] 如果 dp[j+1][i-1] 也是回文串,那麼字串從 j 到 i 也是回文串,即 dp[j][i] 為真。
**:
方法一:
class solution:
def longestpalindrome
(self, s: str)
-> str:
n =len(s)
self.res =
"" def helper
(i,j)
: while i >=
0 and j < n and s[i]
== s[j]
: i -=
1 j +=1if
len(self.res)
< j - i -1:
self.res = s[i+
1:j]
for i in range
(n):
helper
(i,i)
helper
(i,i+1)
return self.res
方法二:
class solution:
def longestpalindrome
(self, s: str)
-> str:
if not s:
return
"" max_len =
1 n =
len(s)
start =
0for i in range(1
,n):
even = s[i-max_len:i+1]
odd = s[i - max_len-
1:i+1]
#print
(even,odd)
if i - max_len -
1>=
0 and odd == odd[::
-1]:
start = i - max_len -
1 max_len +=
2 elif i - max_len >=
0 and even == even[::
-1]:
start = i - max_len
max_len +=
1
#print
(start,max_len)
return s[start: start+max_len]
方法三:
class solution:
def longestpalindrome
(self, s: str)
-> str:
if not s :
return
"" res =
"" n =
len(s)
dp =[[
0]* n for
_ in range
(n)]
max_len =
float
("-inf"
)for i in range
(n):
for j in range
(i +1)
:if s[i]
== s[j] and (i - j <
2 or dp[j +1]
[i -1]
):dp[j]
[i]=
1if dp[j]
[i] and max_len < i +
1- j:
res = s[j : i +1]
max_len = i +
1- j
return res
IT人才最容易犯的17個錯誤
記得剛參加工作時 那是97年 中國的it剛剛興起,那時,作為乙個it人士是一件很光榮的事,而那時的我正在做電氣和電子相關的工作。99年第一次跳槽,進入了it行業做軟體開發。至今,中國的it已經走過了十多年。但昔日的 光榮一員 卻成為了現在的 it農民工 這究竟是怎麼了?是中國的it發展已經很好了所造...
HASHMAP JDK1 7 最詳細原理分析(二)
昨天的部落格我解釋了hashmap jdk1.7 在put的時候會發生衝突,而解決衝突的方式就是使用鍊錶,那麼我們假設hashmap儲存結構如下圖 那麼節點1和節點2組成了乙個鍊錶,那麼現在如果再來put乙個節點3,假設節點3也需要插在這個鍊錶中,我們考慮鍊錶的插入效率,將節點3插在鍊錶的頭部是最快...
Ubuntu 11 04下最流行的17款應用
ad 1,chromium web browser 無需多論。安裝 安裝 安裝 4,cheese webcam booth給自己照張相,加上效果。早上起來做鏡子,以此為鏡,可以知髮型 安裝 5,audacity錄音,編輯音訊檔案 安裝 安裝 7,skype打打 與親友保持通訊,告訴他們,我是乙個幸福...