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

被折叠的 条评论
为什么被折叠?



