递归+回溯
:对于按下的每个键,采用递归加回溯
的方法
package BDyNamicProgramming;
import sun.dc.pr.PRError;
import java.util.ArrayList;
import java.util.List;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/25 0025 17:02
*/
public class Problem17 {
public List<String> letterCombinations(String digits) {
//返回结果
List<String> rs = new ArrayList<>();
if(digits.equals("")) return rs;
//输入的数字字符串
// 拆分成字母字符串
String[] s = new String[digits.length()];
for(int i=0;i<digits.length();i++){
switch (digits.charAt(i)){
case '2':s[i]="abc";break;
case '3':s[i]="def";break;
case '4':s[i]="ghi";break;
case '5':s[i]="jkl";break;
case '6':s[i]="mno";break;
case '7':s[i]="pqrs";break;
case '8':s[i]="tuv";break;
case '9':s[i]="wxyz";break;
}
}
dfs(rs,s,digits.length(),new StringBuilder(),0);
return rs;
}
/*
从字符串数字中随机跳一个
然后再字符串数组第二Index处挑一个
在第三个随机条
。。。。
。。。。
。。。。。
在字符串数组第一个元素的第二个位置条
*/
/**
*
* @param rs 返回结果
* @param s 所有待选的字符串的组合 [[a,b,c],[d,e,f]]
* @param size 按下的位数现在已经剩下几个
* @param index 从s的第几个下标开始
*/
public void dfs(List<String> rs,String[] s,int size,StringBuilder sb,int index){
//挑出的个数已经符合题目的要求
if(size==0 ){
rs.add(new String(sb));
return;
}
//对应字符串组合的每种可能
for(int i=0;i<s[index].length();i++){
//当前数组中第i个位置中挑选一个
sb.append(s[index].charAt(i));
//数组的i+1个位置进行接着挑选
dfs(rs,s,size-1,sb,index+1);
//进行回溯
sb.deleteCharAt(index);
}
}
public static void main(String[] args) {
Problem17 problem17 = new Problem17();
String digits= "23";
List<String> list = problem17.letterCombinations(digits);
System.out.println(list);
}
}