[Happy DSA] 求解最长回文子字符串

本文介绍了一种用于查找字符串中最长回文子串的线性时间复杂度算法——Manacher's Algorithm,并提供了详细的算法思路及C++实现代码。通过将原始字符串转换并应用Manacher算法,可以高效地解决此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。

比如输入字符串google,由于该字符串里最长的对称子字符串是goog,因此输出4


关于这个问题,有一个比较好的线性时间复杂度的算法Manacher's ALGORITHM

这2篇技术博客非常好的阐述了它的算法思想:

1) http://www.felix021.com/blog/read.php?2040 (中文)

2) http://www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html


更多的博客文章可供参考:

http://www.akalin.cx/longest-palindrome-linear-time


C++代码实现:

// longest palindromic substring
// http://www.felix021.com/blog/read.php?2040
// Manacher's ALGORITHM: O(n)
std::string lps(const std::string& str)
{
    std::cout << "original string is " << str << std::endl;
    std::string ss = "$";
    std::ostringstream ostr;
    for (int i = 0; i < str.length(); i++)
    {   
        ostr << '#' << str[i];
    }   
    ostr << "#";
    ss += ostr.str();
    std::cout << "new string is " << ss << std::endl;

    int* p = new int[ss.length()];
    *p = 0;

    int id = 0, mix = 0;
    for (int i = 1; i < ss.length(); i++)
    {   
        p[i] = (mix > i) ? std::min(p[2*id - i], mix-i) : 1;
        while (ss[i + p[i]] == ss[i-p[i]]) p[i]++;
        if (p[i] + i > mix)    
        {   
            mix = p[i] + i;
            id = i;
        }   
    }   
    
    int* pmax = std::max_element(p, p+ss.length());
    int ipos = (pmax - p)/2;
    int len = *pmax - 1;
   std::string lpsstr = str.substr(ipos-len/2, len);

    delete [] p;
    return lpsstr;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值