组合总数
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
class Solution {
vector<vector<int>> res;
vector<int>temp;
public:
void dfs(vector<int>& candidates, int target, int idx){
if(target<0){
return;
}
if(target==0){
res.push_back(temp);
return;
}
for(int i =0; i<=idx;i++){
temp.push_back(candidates[i]);
dfs(candidates, target-candidates[i], i);
temp.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
dfs(candidates, target, candidates.size()-1);
return res;
}
};
为了去重,需使用idx来约束每轮的终点
有了 4 3 2 后就不能出现 2 3 4
括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
class Solution {
vector<string>res;
string temp;
public:
void dfs(int n, int left, int right){
if(left < right){
return;
}
if(left == n && right== n){
res.push_back(temp);
return;
}
if(left<n){
temp.push_back('(');
dfs(n, left+1, right);
temp.pop_back();
}
if(right<n){
temp.push_back(')');
dfs(n, left, right+1);
temp.pop_back();
}
}
vector<string> generateParenthesis(int n) {
dfs(n, 0, 0);
return res;
}
};
单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
class Solution {
public:
bool dfs(vector<vector<char>>& board, string word, int k, int i, int j){
if(k == word.size()){
return true;
}
if(i<0 || j<0 || i>=board.size() || j>=board[0].size() || board[i][j]!=word[k]){
return false;
}
char c = board[i][j];
board[i][j] = '0';
bool res = dfs(board, word, k+1, i-1, j) || dfs(board, word, k+1, i, j+1) || dfs(board, word, k+1, i, j-1) || dfs(board, word, k+1, i+1, j);
board[i][j] = c ;
return res;
}
bool exist(vector<vector<char>>& board, string word) {
for(int i =0; i<board.size(); i++){
for(int j =0; j<board[0].size(); j++){
if(board[i][j]==word[0] && dfs(board, word, 0, i, j)){
return true;
}
}
}
return false;
}
};