代码随想录算法训练营第27天 [39. 组合总和 40.组合总和II 131.分割回文串]
一、39. 组合总和
链接: 代码随想录.
思路:模板题,需要加深对start_index的理解
做题状态:看解析后做出来了
class Solution
{
public:
vector<int> path;
vector<vector<int>> result;
vector<vector<int>> combinationSum(vector<int> &candidates, int target)
{
backtracking(candidates, target, 0);
return result;
}
void backtracking(vector<int> &candidates, int target, int start_index)
{
int sum = 0;
for (auto i : path)
{
sum += i;
}
if (sum == target)
{
result.push_back(path);
return;
}
if (sum > target)
{
return;
}
for (int i = start_index; i < candidates.size(); i++)
{
path.push_back(candidates[i]);
backtracking(candidates, target, i);
path.pop_back();
}
}
};
二、40.组合总和II
链接: 代码随想录.
思路:树枝去重和树层去重,使用used数组
做题状态:看解析后做出来了
class Solution
{
public:
vector<int> path;
vector<vector<int>> result;
vector<vector<int>> combinationSum2(vector<int> &candidates, int target)
{
vector<int> used(candidates.size(), 0);
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, used);
return result;
}
void backtracking(vector<int> &candidates, int target, int start_index, vector<int> &used)
{
int sum = 0;
for (auto i : path)
{
sum += i;
}
if (sum == target)
{
result.push_back(path);
return;
}
if (sum > target)
{
return;
}
for (int i = start_index; i < candidates.size() && (sum + candidates[i] <= target); i++)
{
// user[i - 1] == 0 说明是同一树层使用过candidates[i - 1]
// user[i - 1] == 1 说明是同一树枝使用过candidates[i - 1]
if (i >= 1 && candidates[i] == candidates[i - 1] && used[i - 1] == 0)
{
continue;
}
used[i] = 1;
path.push_back(candidates[i]);
backtracking(candidates, target, i + 1, used);
used[i] = 0;
path.pop_back();
}
}
};
三、131.分割回文串
链接: 代码随想录.
思路:
切割问题可以抽象为组合问题
如何模拟那些切割线
切割问题中递归如何终止
在递归循环中如何截取子串
如何判断回文做题状态:看解析后做出来了
class Solution
{
public:
vector<string> path;
vector<vector<string>> result;
vector<vector<string>> partition(string s)
{
backtracking(s, 0);
return result;
}
void backtracking(string s, int start_index)
{
if (start_index == s.size())
{
result.push_back(path);
return;
}
for (int i = start_index; i < s.size(); i++)
{
if (isBackWord(s, start_index, i))
{
string str = s.substr(start_index, i - start_index + 1);
path.push_back(str);
backtracking(s, i + 1);
path.pop_back();
}
}
}
bool isBackWord(string s, int start, int end)
{
while (start < end)
{
if (s[start] != s[end])
{
return false;
}
start++;
end--;
}
return true;
}
};