最长的回文字符串
来源:互联网 发布:淘宝运营书籍推荐 编辑:程序博客网 时间:2024/05/22 07:07
Leecode中第五题,Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html
1. 面对这个题目,最初都会想到一个时间复杂度为O(n^3)的算法,通过两个for循环判断子串是不是回文字符串。这种算法存在着很多的重复性判断。
2. 换一种思考方式,上一种方法通过直接判断给定的字符子串是否符合条件。第二种方法,通过从两端不断扩展字符串,直至不符合回文字符串的要求停止。例如:abcdcba字符串,d是回文字符串,从中间向两端扩展后cdc也是回文字符串。abba,bb是回文字符串,从两端扩展得到的abba也是回文字符串。这种方法,要分两种情况,从上面的例子也可以看出,回文字符串长度为奇数和偶数的情况。
string longestPalindrome(string s) { int mid,start,end; string result;//存放最长的回文字符串 int max_length,length; int n=s.length(); if(s.length()==0 ||s.length()==1) return s; max_length=1; result=s.substr(0,1); for(mid=1;mid<n-1;mid++)//回文字符串长度为奇数 { start=mid-1; end=mid+1; while(start>=0 && end<n && s[start]==s[end]) { start--; end++; } length=end-start-1; if(max_length<length) { max_length=length; result=s.substr(start+1,length); } } for(mid=0;mid<n-1;mid++)//回文字符串为偶数长度 { if(s[mid]!=s[mid+1]) continue; start=mid-1; end=mid+2; while(start>=0 && end<n &&s[start]==s[end]) { start--; end++; } length=end-start-1; if(max_length<length) { max_length=length; result=s.substr(start+1,length); } } return result; }
3 第三种思路是运用动态规划的思想,其基本思路也是第二种方法的思想。动态规划思想,就是避免了计算重复的数据。方法采用了一个两维数组存储子字符串是否是回文字符从。
string longestPalindromeDP(string s) { int n = s.length(); int longestBegin = 0; int maxLen = 1; bool table[1000][1000] = {false};//存储子字符串是否是回文字符串 for (int i = 0; i < n; i++) { table[i][i] = true; } for (int i = 0; i < n-1; i++) { if (s[i] == s[i+1]) { table[i][i+1] = true; longestBegin = i; maxLen = 2; } } for (int len = 3; len <= n; len++) { for (int i = 0; i < n-len+1; i++) { int j = i+len-1; if (s[i] == s[j] && table[i+1][j-1]) { table[i][j] = true; longestBegin = i; maxLen = len; } } } return s.substr(longestBegin, maxLen);}
4.An O(N) Solution (Manacher’s Algorithm)这种方法,下面的网址有提到
http://blog.csdn.net/ggggiqnypgjg/article/details/6645824
- 最长的回文字符串
- 字符串的最长回文字串
- 字符串的最长回文长度
- 字符串中最长的回文字符串长度
- Leetcode-字符串问题--最长的回文字符串
- 求一个字符串的最长回文串
- 求字符串的最长回文子串
- 字符串的最长回文子串
- 求字符串的最长回文子串
- 字符串的最长回文子串问题
- 计算字符串的最长回文子序列
- 求解最长回文字符串的方法
- 找出字符串内最长的回文
- 输出字符串的最长回文序列
- 找出字符串的最长回文 python实现
- 字符串的最长回文子串
- 最长回文字符串
- 最长回文字符串
- C++模板
- 黑马程序员——Objevtive-C——Foundation框架2
- 日期calendar月份加1
- HDU 1272小希的迷宫 并查集问题
- Hive SQL的编译过程
- 最长的回文字符串
- 工作日志4-21
- 十五、类与对象:类的组合
- Android--AsyncTask的使用
- Altium Designer PCB 常用功能键
- 浏览器判断设备是android还是ios
- Linux网络编程——原始套接字实例:MAC 头部报文分析
- android开发学习笔记之权限
- js大数损失精度