01.组合
思路:题目中的n限定了集合的范围,如n=4时,集合为1,2,3,4;k则是每个组合的长度。我们可以得出该题目的大概过程就是:从集合中取出一个数,然后与集合中剩下的数形成组合,直至新集合的长度等于k。
递归的思路:使用for循环遍历集合,使用递归使取出的第一个数与剩下的数组成组合。
function combine(n: number, k: number): number[][] {
let res:number[][] = []
function backTracking(n: number, k: number, startIndex:number, tmpArr:number[]) {
if (tmpArr.length == k) {
res.push(tmpArr.slice())
return
}
for (let i = startIndex; i <= n - k + 1 + tmpArr.length; i++) {
tmpArr.push(i)
backTracking(n, k, i + 1, tmpArr)
tmpArr.pop()
}
}
backTracking(n, k, 1, [])
return res
};
02.电话号码的组合
思路:创建一个map存储每个电话号码代表的字母。首先确定递归函数参数:digits、index(记录遍历到了第几个数字)、存放遍历节点的临时数组;终止条件:当index等于digits的长度时,递归结束;单层遍历逻辑:取得第index个数字所代表的字符数组,然后遍历这个数组
function letterCombinations(digits: string): string[] {
if (digits === '') return [];
const strMap: { [index: number]: string[] } = {
1: [],
2: ['a', 'b', 'c'],
3: ['d', 'e', 'f'],
4: ['g', 'h', 'i'],
5: ['j', 'k', 'l'],
6: ['m', 'n', 'o'],
7: ['p', 'q', 'r', 's'],
8: ['t', 'u', 'v'],
9: ['w', 'x', 'y', 'z'],
}
let ans:string[] = []
function backTracking(digits:string, index:number, tmpArr:string[]) {
if (index == digits.length) {
ans.push(tmpArr.join(''))
return ;
}
let letter:string[] = strMap[digits[index]]
for (let i = 0; i < letter.length; i++) {
tmpArr.push(letter[i])
backTracking(digits, index + 1, tmpArr)
tmpArr.pop()
}
}
backTracking(digits, 0, [])
return ans
};