目录
[toc]
17 电话号码的字母组合(回到目录)
定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1:
不对应任何字母。
示例:
|
|
==大坑==:
实际上这行代码是省略了的,因为对于一个字符串来说,结束符是‘\0’,index加到最后面递归函数自然会return,所以可以不用return。我一开始,是直接在res.push_back(local);
的下一行加return,那肯定是错的。因为index还没大于digits.size,就不能return.
39 组合总和 I(回到目录)
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
示例 2:
|
|
40 组合总和 II(回到目录)
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
示例 2:
方法1
另一种做法:使用set容器,代码和上面那题一样的
46 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
|
|
注:我们来仔细推敲一下循环体里的代码,当我们对序列进行交换之后,就将交换后的序列除去第一个元素放入到下一次递归中去了,递归完成了再进行下一次循环。这是某一次循环程序所做的工作,这里有一个问题,那就是在进入到下一次循环时,序列是被改变了。可是,如果我们要假定第一位的所有可能性的话,那么,就必须是在建立在这些序列的初始状态一致的情况下,所以每次交换后,要还原,确保初始状态一致。
47 全排列II(回到目录)
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
|
|
77 组合(回到目录)
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
递归回溯
78 子集(回到目录)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
小象写法
for循环里递归
90 子集 II(回到目录)
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
小象解法:
for循环里面递归
131 分割回文串(回到目录)
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
这是一道需要用DFS来解的题目,既然题目要求找到所有可能拆分成回文数的情况,那么肯定是所有的情况都要遍历到,对于每一个子字符串都要分别判断一次是不是回文数,那么肯定有一个判断回文数的子函数,还需要一个DFS函数用来递归,再加上原本的这个函数,总共需要三个函数来求解。代码如下:
注:那么,对原字符串的所有子字符串的访问顺序是什么呢,如果原字符串是 abcd, 那么访问顺序为:a -> b -> c -> d -> cd -> bc -> bcd-> ab -> abc -> abcd
, 这是对于没有两个或两个以上子回文串的情况。那么假如原字符串是aabc
,那么访问顺序为:a -> a -> b -> c -> bc -> ab -> abc -> aa -> b -> c -> bc -> aab -> aabc
,中间当检测到aa时候,发现是回文串,那么对于剩下的bc当做一个新串来检测,于是有b -> c -> bc
,这样扫描了所有情况,即可得出最终答案。