面试题整理-线性时间求最长回文子串
来源:互联网 发布:登录页面sql注入 编辑:程序博客网 时间:2024/05/22 11:38
Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length ofS is 1000, and there exists one unique longest palindromic substring.
这里给出代码如下:
#define get(i) (i? ((i&1)? '-': str[(i>>1)-1]): '$')string longestPalindrome(string &s){int i, max_right_center = 0, max_right_length = 0;int max_center = -1, max_length = -1, t, len = s.length();const char *str = s.c_str();int *p = new int[len << 3];for (i = 1; '\0' != get(i); ++i){p[i] = 1;if (max_right_length > i) {int j = (max_right_center<<1) - i;p[i] = std::min(p[j], max_right_length - i);}while (get((i-p[i])) == get((i+p[i]))) ++p[i];if (p[i] > max_length){max_length = p[i];max_center = i;}t = i + p[i];if (t > max_right_length){max_right_length = t;max_right_center = i;}}delete [] p;int start = max_center - max_length + 1;start += (start&0x01); start >>= 1; --start;return s.substr(start, max_length - 1);}
可以看一下线性时间回文串的处理方法,值得一提的是最后的长度是max_length - 1;
寻找起点的过程如下:
首先是在$_a_b_c类似的字符串中找到起点。
当发现起点指向_符号的时候,就向前走一格。也就是start += (start & 0x01)
接着再定位一下每个字符在原始字符中的位置。如a的位置是2 原始位置为0.b位置为4,原始位置为1.
则是start = (start>>1)-1
从而可以得到子串。
- 面试题整理-线性时间求最长回文子串
- Manacher 线性时间求最长回文串
- 【面试题】最长回文子串
- 面试题 最长回文子串
- 【面试题之算法部分】最长回文子串
- O(n)时间求字符串的最长回文子串
- O(n)时间求字符串的最长回文子串
- 线性时间求最大回文子串的Manacher算法
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- HDU3068-最长回文---O(n)时间求最长回文子串
- 面试题:求最长公共子串(利…
- hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )
- 推荐两个界面原型设计工具--GUIDesignStudio 和 Mockups For Desktop
- Call Android API to control flight mode (Airplane Mode) On / Off
- 数据库索引有关
- redis是一个key-value存储系统
- 容器知识点总结
- 面试题整理-线性时间求最长回文子串
- Domino中的读者域和作者域
- Are You a Zen Coder or Distraction-Junkie
- iphone开发之获取系统磁盘大小和可用磁盘大小
- XP 怎么根据进程名及服务名自动杀死相关进程
- CAP理论(这个更易于理解)
- SQL2008下打不开配置管理器的解决办法
- 最终一致性/BASE VS ACID
- 在Android中创建和使用数据库