题目:Letter Combinations of a Phone Number
难度:medium
问题描述:
Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
关键词:Backtracking,String
解题思路:
首先分析问题,这是一个穷举问题,需要解得所有的可能值。对于2-9,按下后有不同的可能性,对于1和0,则不会有任何输出,等于“没有按键”。由此,我们可以对输入进行预处理(通过String prestr(String str)函数)。例如,输入“0251”,实际处理的是字符串“25”。
预处理之后,我们创建一个二维数组table[10][4],table[I][j]=按键I代表的第j中可能字符,table[3][2]就代表f(j从0开始)。
接下来,我们可以通过回溯算法来对所有可能进行穷举。回溯算法其实就是一个迭代的过程,类似于深度优先搜索。
具体代码如下:
public class Solution {
String[] strc;
String temp="";
int border;
String[][] table=new String[10][4];
public List
letterCombinations(String digits) {
ArrayList
list=new ArrayList<>();
tableinit();
if(digits==null){
return list;
}
if(digits==""){
return list;
}
digits=prestr(digits);
strc=new String[digits.length()];
border=digits.length();
// System.out.println("border="+border);
solution(digits,list,0);
// System.out.println("--------");
return list;
}
public void tableinit(){
table[0][0]="";table[0][1]="";table[0][2]="";table[0][3]="";
table[1][0]="";table[1][1]="";table[1][2]="";table[1][3]="";
table[2][0]="a";table[2][1]="b";table[2][2]="c";table[2][3]="";
table[3][0]="d";table[3][1]="e";table[3][2]="f";table[3][3]="";
table[4][0]="g";table[4][1]="h";table[4][2]="i";table[4][3]="";
table[5][0]="j";table[5][1]="k";table[5][2]="l";table[5][3]="";
table[6][0]="m";table[6][1]="n";table[6][2]="o";table[6][3]="";
table[7][0]="p";table[7][1]="q";table[7][2]="r";table[7][3]="s";
table[8][0]="t";table[8][1]="u";table[8][2]="v";table[8][3]="";
table[9][0]="w";table[9][1]="x";table[9][2]="y";table[9][3]="z";
}
public void solution(String str,ArrayList
list,int cs){
int cengshu=cs;
String tempstr;
// System.out.println("cengshu="+cengshu);
if(str==null||str.equals("")){
return;
}
int i=(int)str.charAt(0)-(int)'0';
// System.out.println("截取字符:"+i);
for(int j=0;j<4;j++){
strc[cengshu]=table[i][j];
if(strc[cengshu]=="") continue;
// System.out.println("strc["+cengshu+"]="+strc[cengshu]);
if(cengshu+1==border){
for(int k=0;k<=cengshu;k++){
// System.out.println("边界了 合体"+"strc["+k+"]="+strc[k]);
temp=temp+strc[k];
}
list.add(temp);
temp="";
}else{
tempstr=str.substring(1);
// System.out.println("层数未到最大值:substr="+tempstr);
solution(tempstr,list,(cengshu+1));
}
}
}
public String prestr(String str){
StringBuffer bstr=new StringBuffer(str);
for(int i=0;i