1.组合总和
1.1 题目
. - 力扣(LeetCode)
1.2 题解
class Solution
{
public:
/// <summary>
/// 返回结果
/// </summary>
vector<vector<int>> result;
/// <summary>
/// 收集的值
/// </summary>
vector<int> path;
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
backtracking(candidates, target,0);
return result;
}
int GetSum(vector<int> vec)
{
int sum = 0;
for (auto i : vec)
{
sum += i;
}
return sum;
}
void backtracking(vector<int>& candidates, int target,int index)
{
int sum = GetSum(path);
//确定终止条件
if (sum == target)
{
result.push_back(path);
return;
}
else if (sum > target)
{
return;
}
//单层递归逻辑
for (int i = index; i < candidates.size(); i++)
{
path.push_back(candidates[i]);
backtracking(candidates, target,i);
path.pop_back();
}
}
};
2.组合总和II
2.1 题目
. - 力扣(LeetCode)
2.2 题解
class Solution
{
public:
/// <summary>
/// 返回结果
/// </summary>
vector<vector<int>> result;
/// <summary>
/// 收集的值
/// </summary>
vector<int> path;
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;
}
int GetSum(vector<int> vec)
{
int sum = 0;
for (auto i : vec)
{
sum += i;
}
return sum;
}
void backtracking(vector<int>& candidates, int target, int index,vector<int> used)
{
int sum = GetSum(path);
//确定终止条件
if (sum == target)
{
sort(path.begin(), path.end());
result.push_back(path);
return;
}
else if (sum > target)
{
return;
}
//单层递归逻辑
for (int i = index; i < candidates.size(); i++)
{
if (i >= 1 && candidates[i] == candidates[i - 1]&&used[i-1]==0)continue;
path.push_back(candidates[i]);
used[i] = 1;
backtracking(candidates, target, i + 1,used);
path.pop_back();
used[i]=0;
}
}
};
3.分割回文串
3.1 题目
. - 力扣(LeetCode)
3.2 题解
class Solution {
public:
vector<vector<string>> result;
vector<string> vec;
vector<vector<string>> partition(string s)
{
result.clear();
vec.clear();
backtracking(s, 0);
return result;
}
/// <summary>
/// 判断是不是回文
/// </summary>
/// <param name="s"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <returns></returns>
bool isPalindrome(const string& s, int start, int end)
{
for (int i = start, j = end; i < j; i++, j--)
{
if (s[i] != s[j])
{
return false;
}
}
return true;
}
void backtracking(string s, int index)
{
//确定终止条件
if (index == s.size())
{
result.push_back(vec);
return;
}
for (int i = index; i < s.size(); i++)
{
if (isPalindrome(s, index, i))
{
string str = s.substr(index, i - index + 1);
vec.push_back(str);
}
else
{
continue;
}
backtracking(s, i + 1);
vec.pop_back();
}
}
};