美文网首页
LeetCodeDay39 —— 最长回文子串★★★★

LeetCodeDay39 —— 最长回文子串★★★★

作者: GoMomi | 来源:发表于2018-05-17 18:41 被阅读0次

5. 最长回文子串

描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例
示例 1:
  输入: "babad"
  输出: "bab"
  注意: "aba"也是一个有效答案。

示例 2:
  输入: "cbbd"
  输出: "bb"
思路
  1. 回文串有两种形式,奇数和偶数形式的,可以依次遍历以每个字符为中心的两种形式的回文串,求出最长的一个即可。时间复杂度为O(n^2)
  2. Manacher算法,时间复杂度为O(n),能够理解其核心思维,但编程代码还需进一步深入了解。附上两个参考地址(参考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);
  }
};

相关文章

  • LeetCodeDay39 —— 最长回文子串★★★★

    5. 最长回文子串 描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。 ...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • 打卡-最长回文子串

    最长回文子串(中等)

  • 最长回文子序列

    该问题区别于最长回文子串,子串必须是连续的,而子序列则可以跳跃,例如AABCAA的最长回文子串为AA,但是它的最长...

  • Manacher算法

    最长回文子串问题# 给定一个字符串,找出最长的回文子串,如"waabwswbfd",则最长子串为bwsb. 中心试...

  • 最长回文子串问题—Manacher算法

    最长回文串问题是一个经典的算法题。 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果...

  • LeetCode 第647题:回文子串

    1、前言 2、思路 此题与最长回文子串很像,只不过那个是求最长的回文子串,而这个是求回文子串的数目。但是他们的解法...

  • C语言实现求最长回文子串

    最长回文子串的概念 回文串是指正序和反序都一样的字符串,例如:Str1 = "AbbA",则Str1的最长回文子串...

  • Manacher's Algorithm算法分析Java

    Manacher's Algorithm俗称马拉车算法,对于求字符串中最长回文子串效率极高。 在求最长回文子串的时...

网友评论

      本文标题:LeetCodeDay39 —— 最长回文子串★★★★

      本文链接:https://www.haomeiwen.com/subject/ynlidftx.html