【发布时间】:2014-08-26 19:34:09
【问题描述】:
回文分区
给定一个字符串 s,分区 s 使得 partition 是回文。
返回所有可能的回文 s的划分。
个人认为,时间复杂度是O(n^n),n是给定字符串的长度。
谢谢Dan Roche,时间复杂度= O(n* (2^n)),详情见下方。
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> list;
vector<string> subList;
// Input validation.
if (s.length() <= 1) {
subList.push_back(s);
list.push_back(subList);
return list;
}
int len = s.length();
vector<vector<bool>> memo(len, vector<bool>(len));
for (int i = 0; i < len; i ++) {
for (int j = 0; j < len; j ++) {
if (i >= j) memo[i][j] = true;
else memo[i][j] = false;
}
}
int start = 0;
helper(s, start, list, subList, memo);
return list;
}
void helper(string s, int start,
vector<vector<string>> &list, vector<string> &subList,
vector<vector<bool>> &memo) {
// Base case.
if (start > s.length() - 1) {
vector<string> one_rest(subList);
list.push_back(one_rest);
return;
}
for (int len = 1; start + len <= s.length(); len ++) {
int end = start + len - 1;
memo[start][end] = (len == 1) ||
(memo[start + 1][end - 1] && s[start] == s[end]);
if (memo[start][end] == true) {
// Have a try.
subList.push_back(s.substr(start, len));
// Do recursion.
helper(s, end + 1, list, subList, memo);
// Roll back.
subList.pop_back();
}
}
}
};
【问题讨论】:
-
partition中的算法对我来说看起来像 O(n^2),但我不确定你的helper是什么,因为它是递归的,我还没有试运行它在我的脑海里。 -
谢谢戴。由于一次递归中有一个循环,我也很难在脑海中运行它。
-
我有一个 O(n^2) 的解决方案如果你想要我可以发布解决方案。
标签: c++ algorithm big-o dynamic-programming palindrome