题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
解题思路:这是一个排列组合的问题,使用回溯来解决。通过枚举出所有数字所对应的字符串,在对数字所对应的字符串进行回溯操作,枚举出所有对应的可能性
时间复杂度O(3^m x 4 ^ n) m是三个字母对应的数字,n是四个字母对应的数字
空间复杂度:
public class Solution {
public List<String> letterCombinations(String digits) {
char[] chars = digits.toCharArray();
List<String> list = new ArrayList<>();
if (chars.length ==0) return list;
StringBuffer b = new StringBuffer();
//将2-9对应的字符放入字符串中
String[] str = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
backtracking(list,chars,b,str,0);
return list;
}
public static void backtracking(List<String> list,char[] chars,StringBuffer buffer,String[] str,int index){
if (buffer.length() == chars.length){
list.add(buffer.toString());
return;
}
//识别数字,哪个数字就是哪个数字所对应的字符串
int k = chars[index] - '0';
for (int i = 0;i<str[k].length();i++){
buffer.append(str[k].charAt(i));
backtracking(list,chars,buffer,str,++index);
//回溯
buffer.deleteCharAt(buffer.length()-1);
--index;
}
}
}