給定乙個字串 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 還有可能是回文串嗎?當然不可能!所以...