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
原创粉丝点击