【回溯算法2】
- 手机
- 2025-08-23 18:09:02

力扣17.电话号码的字母组合
链接: link
思路这道题容易想到用嵌套的for循环实现,但是如果输入的数字变多,嵌套的for循环也会变长,所以暴力破解的方法不合适。 可以定义一个map将数字和字母对应,这样就可以获得数字字母的映射了,递归中index参数理解成遍历过的第几个数字,也可以想成二叉树的深度,当index值等于digits长度时表示已经递归到叶子节点,要结束递归了。 关于把回溯问题想成二叉树的思路,可以参照之前写的回溯1的思路
class Solution { List<String> res = new ArrayList<>();// 保存最后结果 public List<String> letterCombinations(String digits) { if(digits == null || digits.length() == 0){ return res; } //初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串"" String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; backTrace(digits,numString,0); return res; } StringBuilder sb = new StringBuilder();// 字符串拼接 void backTrace(String digits, String[] numString,int index){ if(index == digits.length()){ res.add(sb.toString()); return; } //当前 数字对应的字符串 String str = numString[digits.charAt(index) - '0']; for(int i = 0;i<str.length();i++){ sb.append(str.charAt(i)); backTrace(digits,numString,index+1); sb.deleteCharAt(sb.length() - 1); } } } 思路这道题和回溯1出现的题有区别,但是思路相似,这道题可以出现重复的元素。所以递归下一层start参数不用+1 39.组合总和 链接: link
class Solution { List<List<Integer>> res = new ArrayList(); List<Integer> path = new ArrayList(); public List<List<Integer>> combinationSum(int[] candidates, int target) { backTrace(candidates,target,0,0); return res; } void backTrace(int[] candidates,int target,int sum, int start){ if(sum == target){ res.add(new ArrayList(path)); return; } for(int i = start;i < candidates.length;i++){ if (sum > target) { continue; } sum += candidates[i]; path.add(candidates[i]); backTrace(candidates,target,sum,i); sum -= candidates[i]; path.remove(path.size() - 1); } } }