17. 电话号码的字母组合
class Solution {
List<String> result = new ArrayList<>();
StringBuffer path = new StringBuffer();
int count = 0;
public List<String> letterCombinations(String digits) {
if(digits.length() == 0) return result;
List<String> arr = new ArrayList<>();
arr.add("abc");
arr.add("def");
arr.add("ghi");
arr.add("jkl");
arr.add("mno");
arr.add("pqrs");
arr.add("tuv");
arr.add("wxyz");
//用count记录digits里有几个有效位数
for(int i = 0; i < digits.length();i++){
if(digits.charAt(i) != '1') count++;
}
backstracking(0,digits,arr);
return result;
}
public void backstracking(int start,String str,List<String> arr){
//如果path位数到了就停止循环
if(path.length() == count){
result.add(new String(path.toString()));
return;
}
//从digits第一位开始遍历
for(int i = start;i < str.length();i++){
if(str.charAt(i) == '1') continue;
else{
//如果是2-9,则遍历该数字对应的所有字母组合
int index = str.charAt(i) - '0' - 2;
int len = arr.get(index).length() - 1;
while(len >= 0){
path.append(arr.get(index).charAt(len));
backstracking(i + 1, str, arr);
path.deleteCharAt(path.length() - 1);
len--;
}
}
}
}
}