[Happy DSA] 求解最长回文子字符串
来源:互联网 发布:mysql 查询名次 编辑:程序博客网 时间:2024/05/20 05:55
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串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;}
- [Happy DSA] 求解最长回文子字符串
- 求解最长回文字符串
- 最长回文子串求解
- 最长回文子字符串
- 最长回文子字符串
- 最长回文子字符串
- 求解最长回文子串的长度
- 字符串:最长回文子串
- 最长回文子字符串问题
- 【字符串】最长回文子串
- CUGOJ 1681 求解最长回文字符串
- 求解最长回文字符串的方法
- 动态规划求解最长回文字符串
- 求解字符串的最长回文子串的Manacher’s Algorithm
- 求解最长回文子串的暴力求解
- 字符串的最长回文子序列以及最长子串
- 字符串系列之最长回文子串
- 字符串系列之最长回文子串
- 大端小端-字节存储顺序(转载)
- spring的入门(aop,ioc,bean作用域等)简介
- Rose 2003 破解版在Win7上的安装步骤详解
- 假设检验和t检测
- ActiveMQ消息特性:消息属性
- [Happy DSA] 求解最长回文子字符串
- 计算两个日期之间的天数。
- Effective C++构造函数析构函数Assignment运算符
- 杂记之库函数memset()
- 设计模式之结构型模式二
- 内存屏障 Memery Barrier .
- [linux]简明 Vim 练级攻略
- 浅谈MD5
- sql语句优化