leetcode
来源:互联网 发布:linux中删除文件夹 编辑:程序博客网 时间:2024/04/29 11:51
挺简单的一道题,一开始以为会TLE,没想到居然过了。
转一个特别的的方法,虽然不一定更快。号称O(n)实际上肯定不是:
http://www.cnblogs.com/wuyiqi/archive/2012/06/25/2561063.html
void pk(){ int i; int mx = 0; int id; for(i=1; i<n; i++) { if( mx > i ) p[i] = MIN( p[2*id-i], mx-i ); else p[i] = 1; for(; str[i+p[i]] == str[i-p[i]]; p[i]++) ; if( p[i] + i > mx ) { mx = p[i] + i; id = i; } }}
leetcode后面大部分是提问的。不过有几个思想挺有意思的:把字符串反转,找最长相同子串,一个细节是要找位置跟中轴对称的子串比较。
还有一个写错了的code找的是就算中间被隔断开也算回文的最长回文子串。用的是DP思想。
我的代码:
class Solution {public: string longestPalindrome(string s) { int i,i2, j, n = s.length();if (n < 2 || (n == 2 && s[0] == s[1])){return s;}int max = 0, start = 0;for (i = 0; i < n-1; i++){i2 = i;while (s[i2]==s[i2+1]){i2++;}for (j = 1; ; j++){if (i < j || i2 + j > n - 1 || s[i-j] != s[i2+j]){break;}}if ( 2 * (j - 1) + i2 - i > max){max = 2 * (j - 1) + i2 - i;start = i - j + 1;}i = i2;}return s.substr(start, max + 1); }};
找可以被隔开的回文的代码:
string longestPalindrome(string s) {int n = s.size();string dp[1001]; // bottom up string tmp[1001]; // store a copy of dpif (n <= 1){return s;}for (int i = 0; i < n; i++){ dp[i] = tmp[i] = ""; }dp[0] += s[0];for (int i = 1; i<n; i++){copy(dp, dp + i + 1, tmp);dp[i] = string(1, s[i]);for (int j = i - 1; j >= 0; j--){if (s[i] == s[j]){dp[j] = string(1, s[i]) + tmp[j + 1] + string(1, s[i]);}else{if (tmp[j].size() > dp[j + 1].size())dp[j] = tmp[j];elsedp[j] = dp[j + 1];}}}return dp[0];}
0 0
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- Android SDK Manager 无法下载 SDK 问题?
- gvim+ctags+taglist带自动提示功能的代码编辑利器
- 请教大师!如何用 scanf 正确输入数据?
- 用angularjs开发下一代web应用(二):angularjs应用骨架(一)
- 命令行之俄罗斯方块
- leetcode
- sqlserver 在xp虚拟机安装,远程连接
- LeetCode Single Number
- 黑马程序员--面向对象编程思想
- JavaScriPt中的getAttribute()方法
- aws帐单2014-08-03 23:58
- [水]ZOJ1151
- Java查漏补缺-重载和重写
- @Override 关键字