文章目录
[46. 全排列](https://leetcode.cn/problems/permutations/) [78. 子集](https://leetcode.cn/problems/subsets/) [17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/) [39. 组合总和](https://leetcode.cn/problems/combination-sum/) [22. 括号生成](https://leetcode.cn/problems/generate-parentheses/)[子集](https://leetcode.cn/problems/subsets/) [79. 单词搜索](https://leetcode.cn/problems/word-search/) [131. 分割回文串](https://leetcode.cn/problems/palindrome-partitioning/) [51. N 皇后](https://leetcode.cn/problems/n-queens/)
class Solution {
public :
vector< vector< int >> res;
vector< int > track;
vector< bool > vis;
int n;
vector< vector< int >> permute ( vector< int > & nums) {
n = nums. size ( ) ;
track. assign ( n, 0 ) ;
vis. assign ( n, false ) ;
dfs ( nums, 0 ) ;
return res;
}
void dfs ( vector< int > & nums, int curr) {
if ( curr == n) {
res. push_back ( track) ;
return ;
}
for ( int i = 0 ; i < n; i++ ) {
if ( vis[ i] ) continue ;
track[ curr] = nums[ i] ;
vis[ i] = true ;
dfs ( nums, curr + 1 ) ;
vis[ i] = false ;
}
}
} ;
class Solution {
public :
vector< vector< int >> res;
vector< int > track;
vector< vector< int >> subsets ( vector< int > & nums) {
dfs ( nums, 0 , track) ;
return res;
}
void dfs ( vector< int > & nums, int curr, vector< int > & track) {
if ( curr== nums. size ( ) ) {
res. push_back ( track) ;
return ;
}
dfs ( nums, curr+ 1 , track) ;
track. push_back ( nums[ curr] ) ;
dfs ( nums, curr+ 1 , track) ;
track. pop_back ( ) ;
}
} ;
class Solution {
public :
vector< string> letterCombinations ( string digits) {
vector< string> res;
if ( digits. empty ( ) ) return res;
vector< string> list{ "abc" , "def" , "ghi" , "jkl" , "mno" , "pqrs" , "tuv" , "wxyz" } ;
string t;
dfs ( digits, 0 , t, list, res) ;
return res;
}
void dfs ( const string& digits, int curr, string t, const vector< string> & list, vector< string> & res) {
if ( curr== digits. length ( ) ) {
res. push_back ( t) ;
return ;
}
int idx= digits[ curr] - '0' - 2 ;
for ( char c: list[ idx] ) {
dfs ( digits, curr+ 1 , t+ c, list, res) ;
}
}
} ;
class Solution {
public :
vector< vector< int >> res;
vector< vector< int >> combinationSum ( vector< int > & candidates, int target) {
sort ( candidates. begin ( ) , candidates. end ( ) ) ;
vector< int > state;
dfs ( candidates, target, 0 , state) ;
return res;
}
void dfs ( vector< int > & candidates, int target, int start, vector< int > & state) {
if ( target== 0 ) {
res. push_back ( state) ;
return ;
}
for ( int i= start; i< candidates. size ( ) ; i++ ) {
if ( target- candidates[ i] < 0 ) return ;
state. push_back ( candidates[ i] ) ;
dfs ( candidates, target- candidates[ i] , i, state) ;
state. pop_back ( ) ;
}
}
} ;
class Solution {
public :
vector< string> res;
vector< string> generateParenthesis ( int n) {
string state;
dfs ( n, n, state) ;
return res;
}
void dfs ( int left, int right, string state) {
if ( ! left&& ! right) {
state. push_back ( 0 ) ;
res. push_back ( state) ;
}
if ( left>= 0 ) {
state+= '(' ;
dfs ( left- 1 , right, state) ;
state. pop_back ( ) ;
}
if ( right> left) {
state+= ')' ;
dfs ( left, right- 1 , state) ;
state. pop_back ( ) ;
}
}
} ;
class Solution {
public :
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 ( dfs ( board, word, 0 , i, j) ) return true ;
}
}
return false ;
}
int idx[ 4 ] = { 0 , 1 , 0 , - 1 } ;
int idy[ 4 ] = { 1 , 0 , - 1 , 0 } ;
bool dfs ( vector< vector< char >> & board, string word, int curr, int x, int y) {
if ( board[ x] [ y] != word[ curr] ) return false ;
if ( word. size ( ) - 1 == curr) return true ;
char t= board[ x] [ y] ;
board[ x] [ y] = '.' ;
for ( int i= 0 ; i< 4 ; i++ ) {
int a= x+ idx[ i] , b= y+ idy[ i] ;
if ( a< 0 || a> board. size ( ) - 1 || b< 0 || b> board[ 0 ] . size ( ) - 1 || board[ a] [ b] == '.' ) continue ;
if ( dfs ( board, word, curr+ 1 , a, b) ) return true ;
}
board[ x] [ y] = t;
return false ;
}
} ;
const int N= 1005 ;
bool f[ N] [ N] ;
class Solution {
public :
vector< vector< string>> res;
vector< vector< string>> partition ( string s) {
int n = s. length ( ) ;
vector< string> current;
memset ( f, 0 , sizeof ( f) ) ;
for ( int i = 0 ; i < n; i++ ) f[ i] [ i] = 1 ;
for ( int len = 2 ; len <= n; len++ ) {
for ( int l = 0 ; l + len - 1 < n; l++ ) {
int r = l + len - 1 ;
if ( s[ l] == s[ r] && ( len == 2 || f[ l+ 1 ] [ r- 1 ] ) ) f[ l] [ r] = 1 ;
}
}
backtrack ( s, 0 , current) ;
return res;
}
private :
void backtrack ( const string & s, int start, vector< string> & current) {
if ( start == s. length ( ) ) {
res. push_back ( current) ;
return ;
}
for ( int i = start; i < s. length ( ) ; i++ ) {
if ( f[ start] [ i] ) {
current. push_back ( s. substr ( start, i - start + 1 ) ) ;
backtrack ( s, i + 1 , current) ;
current. pop_back ( ) ;
}
}
}
} ;
class Solution {
public :
vector< vector< string>> solveNQueens ( int n) {
vector< vector< string>> res;
vector< string> board ( n, string ( n, '.' ) ) ;
vector< int > cols ( n, 0 ) ;
vector< int > diag1 ( 2 * n - 1 , 0 ) ;
vector< int > diag2 ( 2 * n - 1 , 0 ) ;
dfs ( 0 , n, board, cols, diag1, diag2, res) ;
return res;
}
private :
void dfs ( int row, int n, vector< string> & board, vector< int > & cols, vector< int > & diag1, vector< int > & diag2, vector< vector< string>> & res) {
if ( row == n) {
res. push_back ( board) ;
return ;
}
for ( int col = 0 ; col < n; col++ ) {
int d1 = row - col + n - 1 ;
int d2 = row + col;
if ( cols[ col] || diag1[ d1] || diag2[ d2] ) continue ;
board[ row] [ col] = 'Q' ;
cols[ col] = 1 ;
diag1[ d1] = 1 ;
diag2[ d2] = 1 ;
dfs ( row + 1 , n, board, cols, diag1, diag2, res) ;
board[ row] [ col] = '.' ;
cols[ col] = 0 ;
diag1[ d1] = 0 ;
diag2[ d2] = 0 ;
}
}
} ;