代码模板
let BFS = function ( start, target ) {
let queue = [ ] ;
let visited = new Set ( ) ;
queue. push ( start) ;
visited. add ( start) ;
let step = 0 ;
while ( queue. length !== 0 ) {
let length = queue. length;
for ( let i = 0 ; i < length; i++ ) {
let cur = queue. shift ( ) ;
if ( cur === target)
return step;
for ( let x = 0 ; x < n; x++ ) {
if ( ! visited. has ( x) ) {
queue. push ( x) ;
visited. add ( x) ;
}
}
}
step++ ;
}
}
var combine = function ( n, k ) {
let result = [ ]
let path = [ ]
const backtracking = ( n, k, startIndex ) => {
if ( path. length === k) {
result. push ( [ ... path] )
return
}
for ( let i = startIndex; i <= n; ++ i) {
path. push ( i)
backtracking ( n, k, i + 1 )
path. pop ( )
}
}
backtracking ( n, k, 1 )
return result
} ;
var combinationSum3 = function ( k, n ) {
let result = [ ]
let path = [ ]
let backtracking = ( n, k, startIndex ) => {
if ( path. length === k && path. reduce ( ( a, b ) => a + b) === n) {
result. push ( [ ... path] )
return
}
for ( let i = startIndex; i <= 9 ; i++ ) {
path. push ( i)
backtracking ( n, k, i + 1 )
path. pop ( )
}
}
backtracking ( n, k, 1 )
return result
} ;
var letterCombinations = function ( digits ) {
const digitsLength = digits. length;
const map = [ "" , "" , "abc" , "def" , "ghi" , "jkl" , "mno" , "pqrs" , "tuv" , "wxyz" ] ;
if ( ! digitsLength) return [ ] ;
if ( digitsLength === 1 ) return map[ digits] . split ( "" ) ;
let result = [ ] ;
let path = [ ] ;
const backtracking = ( startIndex ) => {
if ( path. length === digitsLength) {
result. push ( path. join ( "" ) ) ;
return ;
}
for ( const v of map[ digits[ startIndex] ] ) {
path. push ( v) ;
backtracking ( startIndex + 1 ) ;
path. pop ( ) ;
}
}
backtracking ( 0 ) ;
return result;
} ;
var combinationSum = function ( candidates, target ) {
let result = [ ] ;
let path = [ ] ;
let startIndex = 0 ;
let sum = 0
let backtracking = ( sum, startIndex ) => {
if ( sum > target) {
return ;
}
if ( sum === target) {
result. push ( [ ... path] )
return
}
for ( let i = startIndex; i < candidates. length; i++ ) {
sum += candidates[ i] ;
path. push ( candidates[ i] ) ;
backtracking ( sum, i) ;
sum -= candidates[ i] ;
path. pop ( ) ;
}
}
backtracking ( sum, startIndex)
return result;
} ;
var combinationSum2 = function ( candidates, target ) {
let result = [ ] ;
let path = [ ] ;
let startIndex = 0 ;
let sum = 0 ;
let used = new Array ( candidates. length) . fill ( false ) ;
candidates. sort ( ) ;
let backtracking = ( sum, startIndex ) => {
if ( sum > target) {
return ;
}
if ( sum === target) {
result. push ( [ ... path] )
return
}
for ( let i = startIndex; i < candidates. length; i++ ) {
if ( candidates[ i] === candidates[ i - 1 ] && used[ i - 1 ] == false ) continue ;
sum += candidates[ i] ;
path. push ( candidates[ i] ) ;
used[ i] = true ;
backtracking ( sum, i + 1 , used) ;
used[ i] = false ;
sum -= candidates[ i] ;
path. pop ( ) ;
}
}
backtracking ( sum, startIndex)
return result;
} ;
var partition = function ( s ) {
let result = [ ] ;
let path = [ ] ;
let backtracking = ( startIndex ) => {
if ( startIndex === s. length) {
result. push ( [ ... path] )
}
for ( let i = startIndex; i < s. length; i++ ) {
if ( isPalindrome ( s, startIndex, i) ) {
let str = s. substr ( startIndex, i - startIndex + 1 ) ;
path. push ( str) ;
} else {
continue
}
backtracking ( i + 1 )
path. pop ( ) ;
}
}
backtracking ( 0 ) ;
return result;
} ;
let isPalindrome = function ( s, i, j ) {
while ( i <= j) {
if ( s[ i] !== s[ j] ) {
return false ;
}
i++ ;
j-- ;
}
return true ;
}