解答參考:動態規劃、中心擴散、manacher 演算法
問題描述:
給你乙個字串s
,找到s
中最長的回文子串。比如給定字串s = "babad" ,找出最長的回文子串為"bab"
演算法思路:
本題可以採用暴力破解法、中心擴散法、manacher演算法3種方法,本篇文章講解暴力破解法。
暴力法採用雙指標兩邊夾,驗證是否是回文子串。除了列舉字串的左右邊界以外,比較容易想到的是列舉可能出現的回文子串的「中心位置」,從「中心位置」嘗試盡可能擴散出去,得到乙個回文串。因此中心擴散法的思路是:遍歷每乙個索引,以這個索引為中心,利用「回文串」中心對稱的特點,往兩邊擴散,看最多能擴散多遠。列舉「中心位置」時間複雜度為 o(n),從「中心位置」擴散得到「回文子串」的時間複雜度為 o(n),因此時間複雜度可以降到 o(n^2)。在這裡要注意乙個細節:回文串在長度為奇數和偶數的時候,「回文中心」的形式是不一樣的。
具體編碼細節在以下的**的注釋中體現。
public class solution
int maxlen = 1;
string res = s.substring(0, 1);
// 中心位置列舉到 len - 2 即可
for (int i = 0; i < len - 1; i++)
}return res;
}private string centerspread(string s, int left, int right) else
}// 這裡要小心,跳出 while 迴圈時,恰好滿足 s.charat(i) != s.charat(j),因此不能取 i,不能取 j
return s.substring(i + 1, j);
}}
C 判斷回文串 中心擴散法
一種是暴力檢索 另外一種則是中心擴散法 暴力搜尋法 從字串的開始和末尾處標定乙個點後,依次向後向前檢索,並判斷前後檢索的字串是否相同 bool ispalindrome string s return true 中心擴散法 利用雙指標去線性掃瞄一遍 i,j 判斷是否回文。我們先預處理除所有的 rec...
中心擴散演算法 最長回文子串
這篇看一下中心擴散演算法。輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb include include include include includeusing namespace std 最長回文子串 中心擴散演算法 class soluti...
回文串之中心擴充套件法
中心擴充套件法可以幫助減少在回文子串中暴力遍歷的一次迴圈,在普通暴力遍歷中,我們需要兩次迴圈分別確定左指標和右指標 即回文子串的左右邊界 然後還有一次迴圈向中間靠攏判斷。中心擴充套件法將向中心靠攏的這一步改為了由中心向兩邊延申,由於回文子串有奇數和偶數之分,所以中心擴充套件法的起始點需要分兩種情況討...