leetcode: 5. 最长回文子串

求给定字符串中的最大回文子字符串。

1、遍历法

class Solution {
public:
    string longestPalindrome(string s) {

        if (s.empty()) return s;

        size_t size = s.size();

        int maxLen = 1;
        int start = 0;
        int i = 0, j = 0;
        for (int j = 0; j < size; ++j)
        {
            for (int i = 0; i < j; ++i)
            {
                if(s[i] == s[j])
                {
                    int len = (j - i + 1);
                    if ((i+1) == j and len > maxLen)
                    {
                        maxLen = len;
                        start = i;
                    }
                    else
                    {
                        if (isPalindrome(std::move(s.substr(i + 1, j - 1 - i))) and len > maxLen)
                        {
                            maxLen = len;
                            start = i;
                        }
                    }  
                }
            }
        }

        return s.substr(start, maxLen);
    }

private:
    bool isPalindrome(const string&& s)
    {
        return s == string(s.rbegin(), s.rend());
    }
};

不满足时间要求

2、动态规划(网络答案)

class Solution {
public:
    string longestPalindrome(string s) {

        if (s.empty()) return s;
        int len = s.size();
        if (len == 1) return s;

        int longest = 1;
        int start = 0;
        vector<vector<int> > dp(len, vector<int>(len));
        for (int i = 0; i < len; i++)
        {
            dp[i][i] = 1;
            if(i < len-1)
            {
                if (s[i] == s[i + 1])
                {
                    dp[i][i + 1] = 1;
                    start=i;
                    longest=2;
                }
            }
        }

        for (int l = 3; l <= len; l++)
        {
            for (int i = 0; (i+l-1) < len; i++)
            {
                int j = l+i-1;
                if (s[i] == s[j] and dp[i+1][j-1] == 1)
                {
                    dp[i][j] = 1;
                    start = i;
                    longest = l;
                }
            }
        }

        return s.substr(start,longest);
    }
};

看来在算法方面得加强训练。

猜你喜欢

转载自blog.csdn.net/xunye_dream/article/details/114805483