class Solution {
public:
vector<vector<int>> ans;
void dfs(vector<int>& candidates, int target, int sum, vector<int> arr, int m)
{
if (sum >= target)
{
if (sum==target) ans.push_back(arr);
return;
}
for (int i=m;i<candidates.size();i++)
{
if (i>0 && candidates[i]==candidates[i-1]) continue;
arr.push_back(candidates[i]);
dfs(candidates, target, sum+candidates[i], arr, i);
arr.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
sort(candidates.begin(), candidates.end());
vector<int> arr;
dfs(candidates, target, 0, arr, 0);
return ans;
}
};
这道题有点意思,需要变通一下,要记录每一次是否用过前一个的值。
class Solution {
public:
vector<vector<int>> ans;
void dfs(vector<int>& candidates, int target, int sum, vector<int> arr, int m, vector<bool> used)
{
if (sum >= target)
{
if (sum==target) ans.push_back(arr);
return;
}
for (int i=m;i<candidates.size();i++)
{
if (i>0 && candidates[i]==candidates[i-1] && used[i-1]==false) continue;
arr.push_back(candidates[i]);
used[i] = true;
dfs(candidates, target, sum+candidates[i], arr, i+1, used);
used[i] = false;
arr.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
{
sort(candidates.begin(), candidates.end());
vector<int> arr;
vector<bool> used(candidates.size(), false);
dfs(candidates, target, 0, arr, 0, used);
return ans;
}
};
不要把问题想复杂,分割问题和组合问题实际上是一样的。
class Solution {
public:
vector<vector<string>> ans;
vector<string> arr;
bool isprefix(string s)
{
int i=0;
int j = s.size()-1;
while (i<j)
{
if (s[i]==s[j])
{
i++;
j--;
}
else return false;
}
return true;
}
void dfs(string s, int m)
{
if (m>=s.size())
{
ans.push_back(arr);
return;
}
for (int i=m; i<s.size(); i++)
{
if(isprefix(s.substr(m,i-m+1))) arr.push_back(s.substr(m,i-m+1));
else continue;
dfs(s, i+1);
arr.pop_back();
}
}
vector<vector<string>> partition(string s)
{
dfs(s, 0);
return ans;
}
};