电话号码的字母组合
难度:中等
今天的每日一题 累加数运用到了dfs(深度优先算法),因为之前对这个算法不太了解,所以看了一些视频和博客,所以打算先拿这道题来试试水。
运用dfs求解的核心在于两点:
1、找到截止条件
2、找出“候选人”并筛选
在这道题中,我们的截止条件为遍历的下标==字符串长度,而**“候选人”为数字对应的字母**。
代码如下:
//定义一个char二维数组,外层为手机上的按键数字,内层为数字对应的字母
static char[][] ch = new char[][]{
{},
{},{'a','b','c'},{'d','e','f'},
{'g','h','i'},{'j','k','l'},{'m','n','o'},
{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}
};
public List<String> letterCombinations(String digits) {
//边界条件处理
if(digits.equals("")) return new ArrayList();
dfs(digits,0);
return res;
}
StringBuilder sb = new StringBuilder();
List<String> res = new ArrayList();
public void dfs(String str,int index){
//截止条件
if(str.length()==index){
res.add(sb.toString());
return;
}
//候选人(通过-'0'等到int类型的数字)
for(char c:ch[str.charAt(index)-'0']){
sb.append(c);
//递归
dfs(str,index+1);
//回溯
sb.deleteCharAt(sb.length()-1);
}
}
执行结果:成功