回溯法有“通用的解题法”之称。应用回溯法求解问题时,首先应该明确 问题的解空间。一个复杂问题的解决往往由多部分构成,即,一个大的解决方案 可以看作是由若干个小的决策组成。很多时候它们构成一个决策序列。解决一个 问题的所有可能的决策序列构成该问题的解空间。解空间中满足约束条件的决策 序列称为可行解。一般说来,求解任何问题都有一个目标,在约束条件下使目标 值达到最大(或最小)的可行解称为该问题的最优解。在解空间中,前 k 项决策 已经取定的所有决策序列之集称为 k 定子解空间。0 定子解空间即是该问题的解 空间。
17. 电话号码的字母组合https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
class Solution {
List<String> list=new ArrayList<>();//存储答案
public List<String> letterCombinations(String digits) {
//判断是否为空输入digits
if(digits.length()==0||digits==null){
return list;
}
//设置字典
String[] dic={"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
// 调用回溯
backtracking(digits, dic, 0);
return list;
}
//由于答案返回String,回溯过程中需要拼接String
StringBuilder temp=new StringBuilder();
/**
* String digits:输入“23”
* String[] dic:找到“23”所代表的字符串集合"abc", "def"
* int index:回溯次数,是否到达叶子结点
*/
public void backtracking(String digits, String[] dic, int index){
//回溯出口,并将结果加入结果list
if(index==digits.length()){
list.add(temp.toString());
return;
}
//获取每一层字典"abc", "def"
String str=dic[digits.charAt(index)-'0'];
//循环遍历"abc", "def"
for(int i=0; i<str.length();i++){
temp.append(str.charAt(i));
//从"abc"取一个后到下一层"def"取一个
backtracking(digits, dic, index+1);
//将"def"中添加到temp的删除,回溯尝试新的组合
temp.deleteCharAt(temp.length()-1);
}
}
}