思路
1、首先观察每个电话号码键上数字和字母的关系
对于1-7键:字母=2*(‘数字’-‘2’)+47
对于8-9键:字母=2*(‘数字’-‘2’)+48
2、接着就是回溯的思路,先循环变动最后一个位置上的值,接着循环变动倒数第二个位置上的值。。。。依次往下,直到第一个位置
代码
class Solution {
/**
1.如果需要全局使用可以设置为类变量
2.回溯的思路,用于实现找所有可行解,前面的位置不动,先动后面的位置,直到找到所有解
*/
private List<String> list=new ArrayList<>();
private StringBuffer sb=new StringBuffer();
public List<String> letterCombinations(String digits) {
if(digits.length()==0){
return list;
}
getCombinations(0,digits.length(),digits);
return list;
}
public void getCombinations(int n, int length, String digits) {
if(n==length){
list.add(sb.toString());
return;
}
//n位置需要循环m次
char c=digits.charAt(n);
int m=(c=='9' || c=='7')?4:3;
int inter=0;
if(c<'8'){
inter=2*(c-'2')+47;
}else{
inter=2*(c-'2')+48;
}
for(int i=0;i<m;i++){
//appendCodePoint添加一个字符,相当于appendCodePoint(97) == append(Character.toChars(97))
//这其实也是一个回溯的思路
//先将0位置放上值,然后去遍历后面的位置的值,一步一步再回溯回来
sb.appendCodePoint(c+i+inter);
getCombinations(n+1,length,digits);
//等回溯回来的时候,需要把最后一个位置上的数据删除,便于更新最后一个位置上的数据
sb.deleteCharAt(sb.length()-1);
}
}
}