1.子集
给定一组不含重复元素的数组nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复子集。
思路:回溯算法
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> temp;
vector<int> flag(nums.size(), 0);
traceback(nums, 0, temp, flag, res);
return res;
}
void traceback(vector<int>& nums, int start, vector<int>& temp, vector<int>& flag,vector<vector<int>>& res)
{
if(temp.size() <= nums.size())
{
res.push_back(temp);
}
for(int i = start; i < nums.size(); i++)
{
if(flag[i] == 0)
{
temp.push_back(nums[i]);
flag[i] = 1;
traceback(nums, i + 1, temp, flag, res);
flag[i] = 0;
temp.pop_back();
}
}
}
2.单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
思路:回溯算法
bool traceback(vector<vector<char>>& board, int rows, int cols, int row, int col, string word, int index, vector<vector<int>>& visited)
{
if(index >= word.size())
{
return true;
}
if(row < 0 || row >= rows || col < 0 || col >= cols || board[row][col] != word[index])
{
return false;
}
if(!visited[row][col] && board[row][col] == word[index])
{
visited[row][col] = 1;
bool flag = traceback(board, rows, cols, row - 1 , col, word, index + 1, visited) || traceback(board, rows, cols, row + 1, col, word, index + 1, visited) || traceback(board, rows, cols, row, col - 1, word, index + 1, visited) || traceback(board, rows, cols, row, col + 1, word, index + 1, visited);
visited[row][col] = 0;
return flag;
}
return false;
}
bool exist(vector<vector<char>>& board, string word) {
int rows = board.size();
int cols = 0;
if(rows > 0)
{
cols = board[0].size();
}
vector<vector<int>> visited(rows, vector<int>(cols, 0) );
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
if(traceback(board, rows, cols, i, j, word, 0, visited))
{
return true;
}
}
}
return false;
}