暴力

class Solution {
    struct Node {
        int begin;
        int end;
        int len;
    };
    bool ispalin(const string &s, int left, int right)
    {
        while(left < right) {
            if(s[left++] != s[right--])
                return false;
        }
        return true;
    }
public:
    string longestPalindrome(string s) {
        int n = s.size();
        struct Node ans;
        ans.len = 0;
        int i, j;
        for(i=0; i<n; i++) {
            for(j=n-1; j>=i; j--) {
                if(j-i+1 > ans.len && ispalin(s, i, j)) {
                    ans.begin = i;
                    ans.end = j;
                    ans.len = j-i+1;
                    break;
                }
            }
        }
        string res = s.substr(ans.begin, ans.len);
        return res;
    }
};

 

动态规划:

  d[i][j]标识s串i到j是回文串。判断d[i][j],只需满足s[i]=s[j],切d[i][j]=true

class Solution {

    struct Node {
        int begin;
        int end;
        int len;
    };
public:
    string longestPalindrome(string s) {
        int n = s.size();
            if(n == 0) return "";
        struct Node ans;
        bool d[1086][1086] = {false};
        ans.len = 1;
        ans.begin = ans.end = 0;
        int i, j;
        for(i=n-1; i>=0; i--) {
            d[i][i] = true;
            for(j=i+1; j<n; j++) {
                if(s[i] == s[j] && (j-i <= 2 || d[i+1][j-1])) {
                    d[i][j] = true;
                    if(j-i+1 > ans.len) {
                        ans.begin = i;
                        ans.end = j;
                        ans.len = j-i+1;
                        string res = s.substr(ans.begin, ans.len);
                    }
                }
            }
        }
        string res = s.substr(ans.begin, ans.len);
        return res;
    }
};

 

 posted on 2017-05-06 18:34  平和之心  阅读(113)  评论(0编辑  收藏  举报