方法:递归
class Solution {
private:
vector<string> res;
void solve(string& s, int idx, int pn) {
if (pn == 3) {
if (check(s, idx, s.size()-1)) res.push_back(s);
return ;
}
for (int i = idx; i < s.size(); ++i) {
if (check(s, idx, i)) {
s.insert(s.begin()+i+1, '.');
solve(s, i+2, pn+1);
s.erase(s.begin()+i+1);
} else break;
}
}
bool check(const string& s, int st, int ed) {
if (st > ed) return false;
if (s[st] == '0' && st != ed) return false;
int cur = 0;
for (int i = st; i <= ed; ++i) {
if (s[i] < '0' || s[i] > '9') return false;
cur = cur * 10 + (s[i]-'0');
if (cur > 255) return false;
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
res.clear();
if (s.size() < 4 || s.size() > 12) return res;
solve(s, 0, 0);
return res;
}
};
$时间复杂度O(),空间复杂度(1)
方法:递归
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void solve(vector<int>& nums, int idx) {
res.push_back(path);
if (idx >= nums.size()) return ;
for (int i = idx; i < nums.size(); ++i) {
path.push_back(nums[i]);
solve(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
res.clear();
solve(nums, 0);
return res;
}
};
$时间复杂度O(),空间复杂度(n)
方法:递归
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void solve(vector<int>& nums, int idx) {
res.push_back(path);
if (idx >= nums.size()) return;
for (int i = idx; i < nums.size(); ++i) {
if (i > idx && nums[i-1] == nums[i]) continue;
path.push_back(nums[i]);
solve(nums, i + 1);
path.pop_back();
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
res.clear();
sort(nums.begin(), nums.end());
solve(nums, 0);
return res;
}
};
$时间复杂度O(),空间复杂度(n)