코테준비 - Palindrome Partitioning

정상화·2023년 2월 26일

LeetCode

목록 보기
128/222

Palindrome Partitioning

class Solution {
private:
    unordered_map<string, bool> palindromeMap;
public:
    vector<vector<string>> partition(string s) {
        vector<vector<string>> res;
        vector<string> path;
        recursive(0, s, path, res);

        return vector<vector<string >>(res.begin(), res.end());
    }

    void recursive(int idx, string s, vector<string> &path, vector<vector<string>> &res) {
        if (idx == s.length()) {
            res.push_back(path);
            return;
        }

        for (int i = idx; i < s.length(); i++) {
            string extracted = s.substr(idx, i-idx + 1);
            if (extracted == "aa") {
                int a = 1;
            }
            if (isPalindrome(extracted)) {
                path.push_back(extracted);
                recursive(i + 1, s, path, res);
                path.pop_back();
            }
        }
    }

    bool isPalindrome(string s) {
        if (palindromeMap.find(s) != palindromeMap.end()) {
            return palindromeMap[s];
        }
        int len = s.length();
        vector<int> LPS(len * 2 + 1, 0);
        string dum = "|";
        for (auto &c: s) {
            dum += c;
            dum += '|';
        }

        int i;
        int r = 0, c = 0;
        for (i = 1; i < len * 2 + 1; i++) {
            if (i < r) {
                LPS[i] = min(r - i, LPS[2 * c - i]);
            }

            while (i - 1 - LPS[i] >= 0 && i + 1 + LPS[i] < len * 2 + 1
                   && dum[i + 1 + LPS[i]] == dum[i - 1 - LPS[i]]) {
                LPS[i]++;
            }

            if (LPS[i] > r) {
                c = i;
                r = c + LPS[c];
            }
        }

        palindromeMap[s] = LPS[len] == len;
        return palindromeMap[s];
    }
};
profile
백엔드 희망

0개의 댓글