第五題:最長回文子串【leetcode】

2021-03-02 前端咖
給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。輸入: 'babad'
輸出: 'bab'
注意: 'aba' 也是一個有效答案。

難度:中等

連結:https://leetcode-cn.com/problems/longest-palindromic-substring/

方法一、暴力破解法,第一層循環從字符串開頭開始遍歷,第二層字符串從結尾開始遍歷,當找到與開頭的字符一樣的時候,對比它們之間的字符串,將區間字符串逐一對比,如果是回文且比臨時最大回文字符串的長度對比,如果大於重新賦值最大回文字符串,如果小於跳過。將區間字符串逐一對比,如果不是回文跳過,繼續執行上述步驟。當剩餘字符串小於最大回文字符串,循環結束,返回最大回文字符串。

var longestPalindrome = function(s) {
let isWell = true;
let maxStr = s[0] || '';
for(let i = 0, l = s.length; i < l; i++){
let word = s[i];
if(l - i > maxStr.length){
for(let j = l; j > i; j--){
if(word == s[j]){
isWell = true;
if(isWell){
for(let k = i, kl = i + parseInt((j - i + 1)/2); k < kl; k++){
if(s[k]!=s[j - k + i]){
isWell = false;
}
}
if(isWell){
if(maxStr.length < s.substring(i, j + 1).length){
maxStr = s.substring(i, j + 1);
break;
}
}
}
}else{
isWell = false;
}
}
}else{
break;
}
}
return maxStr;
}

longestPalindrome('qianduankak');

方法二、 中間拓展法,將子串分為單核和雙核的情況,單核即指子串長度為奇數,雙核則為偶數;遍歷每個除最後一個位置的字符index(字符位置),單核:初始low = 初始high = index,low和high均不超過原字符串的下限和上限;判斷low和high處的字符是否相等,相等則low++、high++(雙核:初始high = 初始low+1 = index + 1);每次low與high處的字符相等時,都將當前最長的回文子串長度與high-low+1比較。後者大時,將最長的回文子串改為low與high之間的;重複執行,直至high-low+1 等於原字符串長度或者遍歷到最後一個字符,取當前截取到的回文子串,該子串即為最長的回文子串。

var longestPalindrome = function (s) {
if (!s || s.length < 2) {
return s;
}
let start = 0, end = 0;
let n = s.length;
let centerExpend = (left, right) => {
while (left >= 0 && right < n && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1;
}
for (let i = 0; i < n; i++) {
let len1 = centerExpend(i, i);
let len2 = centerExpend(i, i + 1);
let maxLen = Math.max(len1, len2);
if (maxLen > end - start) {
start = i - ((maxLen - 1) >> 1);
end = i + (maxLen >> 1);
}
}
return s.substring(start, end + 1);
};
longestPalindrome('qianduankak');

方法三、Manacher算法,Manacher於發現了一種線性時間算法,可以在列出給定字符串中從任意位置開始的所有回文子串。回文串(palindromic string)是指這個字符串無論從左讀還是從右讀,所讀的順序是一樣的;簡而言之,回文串是左右對稱的。

前端咖,值得關注,在看哦

相關焦點

  • 最長回文子串 | Leetcode題解
    題目描述給定一個字符串 s,找到 s 中最長的回文子串。你可以假設  s 的最大長度為 1000。,要我們求出給定字符串的最大回文子串。5.longest-palindromic-substring解決這類問題的核心思想就是兩個字「延伸」,具體來說如果在一個不是回文字符串的字符串兩端添加任何字符,或者在回文串左右分別加不同的字符,得到的一定不是回文串
  • 最長回文子串
    題目描述給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
  • LeetCode刷題實戰5:判斷回文子串
    https://leetcode.com/problems/longest-palindromic-substring/翻譯給定一個字符串s,要求它當中的最長回文子串。可以假設s串的長度最大是1000。
  • AK leetcode 流浪計劃 - 回文串
    在此基礎上衍生出回文串計數,求最長回文子串,回文串構造,異型回文(需要對原串字符進行預處理或使用非常規判斷規則)等問題。此類題目的意思往往很容易理解,思路也很容易想到。但是如果沒有掌握回文串基本問題的解法,往往是無法在規定時間內運行出結果。
  • 最長回文子串——馬拉車算法詳解
    馬拉車算法馬拉車算法(Manacher『s Algorithm)是用來解決每天一道算法:最長回文子串問題的。此算法充分利用了回文字符串的性質,將算法複雜度降到了線性,非常值得一學。題目給定一個字符串s,找到s中最長的回文子字符串。所謂回文字符串,指的是無論從左往右讀還是從右往左讀,結果都是一樣的,也叫做對稱字符串。比如 「google」 的最長回文子串為 "goog"。
  • Leetcode刷題-動態規劃
    本文對leetcode上部分動態規劃問題進行分析並用python實現5. 最長回文子串 題目描述給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 2:思路1:分類討論這裡我們用dp存儲以每個字母結尾的最長回文子串的長度,也就是說dp[i]表示以s[i]結尾的最長回文子串的長度。
  • 【面試現場】如何找到字符串中的最長回文子串?
    題目:給你一個字符串,找出裡面最長的回文子串。小史:可以遍歷整個字符串,把每個字符和字符間的空隙當作回文的中心,然後向兩邊擴展來找到最長回文串。小史這次搶著分析時間和空間複雜度。小史:而以第6位為中心的回文串的計算,並不需要進行探索了,因為根據之前第5位為回文中心串的信息和第4位為回文中心串的信息已經可以推斷第6位為回文中心串的長度只能為1。
  • Leetcode刷題-字符串
    字符串其實可以看成是字符組成的數組,在leetcode中一般會有以下幾種題型:不同的字符串題方法也不同,下面具體介紹了5個涉及字符串題的解題思路和python解決方案尤其最後一題尋找最長回文子串問題中,給出了全新的動態規劃思路
  • LeetCode 系列 第5題
    刷題地址: https://leetcode.com/problems/longest-palindromic-substring/簡單描述:Given a string s, return the longest palindromic substring
  • leetcode刷題指南之shortestPalindrome
    給出一個串,能夠在串前添加字母,求出一個最短的回文串。一個回文串的頭和尾同時往中間走,經歷的字符應該是完全一樣的。
  • 一文讀懂回文子串 Manacher 算法
    (點擊上方公眾號,可快速關注)轉自:劉毅https://61mon.com/index.php/archives/181/好文投稿, 請點擊 → 這裡了解詳情背景給定一個字符串,求出其最長回文子串例如:1、s="abcd",最長回文長度為 1;2、s="ababa",最長回文長度為 5;3、s="abccb",最長回文長度為 4,即 bccb。以上問題的傳統思路大概是,遍歷每一個字符,以該字符為中心向兩邊查找。其時間複雜度為 O(n2),效率很差。
  • 回文問題終極篇:最小代價構造回文串
    讓字符串成為回文串的最少插入次數」,難度 Hard。回文串就是正著讀反著讀都一樣的字符串,面試筆試中經常出現回文相關的題目,我們之前有好幾篇講解回文問題的文章,是判斷回文串或者尋找最長回文串/子序列的:經典面試題:最長回文子串子序列解題模板:最長回文子序列如何高效判斷回文單鍊表?
  • [LeetCode] 1143. Longest Common Subsequence 最長公共子序列
    Constraints:這道題讓求最長相同的子序列,注意是子序列,不是子串,所以字符並不需要相連,但是字符順序還是需要保持的。LeetCode 之前也有題目需要藉助求 LCS 來解題,比如 Delete Operation for Two Strings,當時博主還疑惑怎麼 LeetCode 中沒有專門求 LCS 的題呢,這不,終於補上了。
  • 經典leetcode算法題分享(字符串)
    解題思路:一看到這道題,直呼是送分題,這反轉字符串不就是JavaAPI就有了嗎,於是乎直接大膽的,兩行代碼搞定,好傢夥!一下子重拾回作為程式設計師的信心!125.驗證回文串題目:給定一個字符串,驗證它是否是回文串,只考慮字母和數字字符,可以忽略字母的大小寫
  • 春節大禮包|刷題技巧+80道Leetcode
    為了跳槽,我前兩年的春節都是在刷題中度過的,目前為止刷了小四百道leetcode,也算是有一些經驗,今天就跟大家分享下學習方法和我總結的乾貨。刷題時避免不了會有挫敗感的,每次覺得自己很nb了,還是會在一些題上卡住。
  • LeetCode-4-動態規劃
    5.最長回文子串連結:https://leetcode-cn.com/problems/longest-palindromic-substring/給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1:輸入: "babad"輸出: "bab"注意: "aba" 也是一個有效答案。
  • leetcode刷題指南之PalindromePairs
    給定一個字符串數組words,無重複字符串。問:有多少對不同的(i, j)滿足words[i]+words[j]是回文串?
  • 算法總結:最長上升子序列(LIS)
    最長遞增子序列(https://leetcode-cn.com/problems/longest-increasing-subsequence/)總體思路如果你不知道最長上升子序列是什麼意思,也沒有做那道題,我——當然不會怪你 😊最長上升(遞增)子序列這道題是最最基本的,也是最常考的題了,其他題目都是由它衍生而來。
  • LeetCode刷題筆記 - 3. 無重複字符的最長子串
    ,各個標籤的題目都有,可以整體練習,本公眾號後續會帶大家做一做上面的算法題。官方連結:https://leetcode-cn.com/problemset/all/一、題意難度:中等https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
  • 最長公共前綴 | Leetcode題解
    題目描述:編寫一個函數來查找字符串數組中的最長公共前綴。如果不存在公共前綴,返回空字符串 "" 。思路1:當字符串數組長度為 0 時則公共前綴為空,直接返回令最長公共前綴 ans 的值為第一個字符串,進行初始化遍歷後面的字符串,依次將其與 ans 進行比較,兩兩找出公共前綴,最終結果即為最長公共前綴如果查找過程中出現了 ans 為空的情況,則公共前綴不存在直接返回時間複雜度:O(s)O(s)O(s),s 為所有字符串的長度之和思路2:當字符串數組長度為 0 時則公共前綴為空,直接返回令最長公共前綴