LeetCodeDay39 —— 最長(zhǎng)回文子串★★★★

5. 最長(zhǎng)回文子串

描述

給定一個(gè)字符串 s,找到 s 中最長(zhǎng)的回文子串。你可以假設(shè) s 的最大長(zhǎng)度為1000。

示例
示例 1:
  輸入: "babad"
  輸出: "bab"
  注意: "aba"也是一個(gè)有效答案。

示例 2:
  輸入: "cbbd"
  輸出: "bb"
思路
  1. 回文串有兩種形式,奇數(shù)和偶數(shù)形式的,可以依次遍歷以每個(gè)字符為中心的兩種形式的回文串,求出最長(zhǎng)的一個(gè)即可。時(shí)間復(fù)雜度為O(n^2)
  2. Manacher算法,時(shí)間復(fù)雜度為O(n),能夠理解其核心思維,但編程代碼還需進(jìn)一步深入了解。附上兩個(gè)參考地址(參考1)(參考2)
class Solution_05_01 {
 public:
  string longestPalindrome(string s) {
    int cnt = 0;
    string ret;
    if (s.empty()) return ret;
    for (int i = 0; i < s.size(); ++i) {
      int start = i, end = i + 1;
      while (start >= 0 && end < s.size() && s[start] == s[end]) {
        --start;
        ++end;
      }
      int tmp = end - start - 1;
      if (tmp > cnt) {
        cnt = tmp;
        ret.clear();
        for (int j = start + 1; j <= end - 1; ++j) ret.push_back(s[j]);
      }
    }
    for (int i = 0; i < s.size(); ++i) {
      int start = i - 1, end = i + 1;
      while (start >= 0 && end < s.size() && s[start] == s[end]) {
        --start;
        ++end;
      }
      int tmp = end - start - 1;
      if (tmp > cnt) {
        cnt = tmp;
        ret.clear();
        for (int j = start + 1; j <= end - 1; ++j) ret.push_back(s[j]);
      }
    }
    return ret;
  }
};

class Solution_05_02 {
 public:
  string longestPalindrome(string s) {
    string manaStr = "$#";
    for (char ch : s) {
      manaStr += c;
      manaStr += '#';
    }
    vector<int> rd(manaStr.size(), 0);
    int pos = 0, mx = 0;
    int start = 0, maxLen = 0;
    for (int i = 1; i < manaStr.size(); i++) {
      rd[i] = i < mx ? min(rd[2 * pos - i], mx - i) : 1;
      while (manaStr[i + rd[i]] == manaStr[i - rd[i]]) rd[i]++;
      if (i + rd[i] > mx) {
        pos = i;
        mx = i + rd[i];
      }
      if (rd[i] - 1 > maxLen) {
        start = (i - rd[i]) / 2;
        maxLen = rd[i] - 1;
      }
    }
    return s.substr(start, maxLen);
  }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容