題目:
給定乙個字串s
,找到s
中最長的回文子串。你可以假設s
的最大長度為 1000。
示例 1:
輸入: "babad" 輸出: "bab" 注意: "aba" 也是乙個有效答案。
示例 2:
輸入: "cbbd" 輸出: "bb"
方法1:以每個字元為中心依次搜尋最長的回文子串
string longestpalindrom(string s)
if (maxlen < right - left + 1)
} return s.substr(start, maxlen);
}
方法2:動態規劃,用乙個二維陣列dp[i][j]代表第i個字元到第j個字元是否為回文串。在判斷過程中,如果i與j相鄰則直接相等即可,如果,i與j不相鄰,那麼i到j是否為回文串,也與i+1到j-1是否為回文串有關
string longestpalindrom(string s) ;會報錯
int **dp = new int*[s.size()];//動態申請變數空間
for (int i = 0; i < s.size(); ++i)
//dp[i][j]中儲存第i個字元到第j個字元是否回文串
int left = 0, right = 0, len = 0;
for (int i = 0; i < s.size(); i++)
} }for (int i = 0; i < s.size(); i++)//用完之後一定要釋放
deletedp[i];
deletedp;
return s.substr(left, right - left + 1);
}
方法3:利用經典演算法馬拉車演算法,相對而言技巧性較高。但是直接將演算法複雜度由o(n^2)降至o(n)。其主要思路是先將字串處理成根據普遍性的情況,那就是在每個字元的兩邊加上#。比如,bob加上#則為#b#o#b#,noon加上#字元則為#n#o#o#n#;這樣就不用了再分別考慮回文子串是奇數個還是偶數個。同時,我們觀察可以發現此時,回文串的半徑正好等於未經處理回文串的長度。因此,在後期計算時,我們只用找經過處理之後的回文子串的半徑即可。因為,最後我們要輸出,最長的回文子串,所以我們不僅要知道子串的長度,還要知道它的起始位置在何處。這時,在處理好的字元前面加上乙個不是字串s中的也不是#的特殊字元,這樣 (中心位置 - 處理後子串初始位置)/2 就是最小回文子串的初始位置。在遍歷尋找最長子串時,主要是利用回文的對稱性。如下圖所示,其中id代表當前最長子串的中心,i為當前搜尋的中心下標,j為與i關於id對稱的座標值為i-2*id,mx為回文串的最右邊。陣列dp中儲存的是以下標位置為中心的最大回文串半徑
因此,當i如果 當 i>mx時,此時我們就只能以i為中心逐位對比,計算回文串的長度
每次計算完以i為中心的最長子串時,要將id更新為最長子串中心,mx更新為最長子串的最右邊
//用id代表當前最大回文串中心,mx代表回文串的最右邊
int id = 0, mx = 0, reslen=0,rescen=0;
vectorp(t.size(), 0);//用來儲存每個以當前位置為中心的最大回文串長度的半徑
for (int i = 1; i < t.size(); i++)
if (reslen < p[i])
} //開始位置為中心位置減去長度/2,到長度位置
return s.substr((rescen - reslen) / 2, reslen-1);
}
最長回文子串 LeetCode 五 最長回文子串
題目 最長回文子串 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。題目解析 回文?當回文串長度為奇數時,比如 北京計程車租出京北 當回文串長度為偶數的時候,比如 1221 以上兩種情況有乙個共同的特點就是有乙個中心,那在 中如何表示中心呢?class solution ...
leetcode 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 中心拓展法 由乙個中心點開始向兩邊拓展,檢測邊界,判斷兩個值是否相等,相等則繼續拓展下去,檢測邊界。1....
最長回文子串(LeetCode)
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution def longestpalindrome self,s type s str r...