131. Palindrome Partitioning

这道题目竟然做起来感觉有点困难,真是。。。
先是自己想了一个奇怪的写法:
class Solution {
public:
vector<vector<string>> partition(string s) {
if (s.empty())
return vector<vector<string>>();
int sz = s.size();
vector<vector<bool>> dp(sz, vector<bool>(sz, false));
for (int i = sz-1; i >= 0; --i)
for (int j = i; j < sz; ++j) {
if (s[i] == s[j] && (j - i <= 2 || dp[i+1][j-1]))
dp[i][j] = true;
}
map<pair<int, int>, vector<vector<string>>> m;
return helper(s, 0, sz-1, dp, m);
}
private:
vector<vector<string>> helper(string& s, int beg, int end, vector<vector<bool>>& dp, map<pair<int, int>, vector<vector<string>>>& m) {
if (beg > end)
return vector<vector<string>>();
auto key = make_pair(beg, end);
if (m.find(key) != m.end())
return m[key];
vector<vector<string>> res;
if (dp[beg][end])
res.push_back(vector<string>{s.substr(beg, end-beg+1)});
for (int i = end; i > beg; --i) {
if (!dp[i][end])
continue;
string str = s.substr(i, end-i+1);
auto left = helper(s, beg, i-1, dp, m);
for (auto& vec : left) {
vec.push_back(str);
res.push_back(std::move(vec));
}
}
return res;
}
};
后来看了一眼评论区,才想起来应该的做法:
class Solution {
public:
vector<vector<string>> partition(string s) {
if (s.empty())
return vector<vector<string>>();
int sz = s.size();
vector<vector<bool>> dp(sz, vector<bool>(sz, false));
for (int i = sz-1; i >= 0; --i)
for (int j = i; j < sz; ++j) {
if (s[i] == s[j] && (j - i <= 2 || dp[i+1][j-1]))
dp[i][j] = true;
}
vector<vector<string>> res;
vector<string> temp;
dfs(s, 0, res, temp, dp);
return res;
}
private:
void dfs(string& s, int idx, vector<vector<string>>& res, vector<string>& temp, vector<vector<bool>>& dp) {
if (idx == s.size()) {
res.push_back(temp);
return;
}
for (int i = idx; i < s.size(); ++i) {
if (!dp[idx][i])
continue;
temp.push_back(s.substr(idx, i-idx+1));
dfs(s, i+1, res, temp, dp);
temp.pop_back();
}
}
};
浙公网安备 33010602011771号