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
おすすめ