题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
- 0 <= digits.length <= 4
- digits[i] 是范围 [‘2’, ‘9’] 的一个数字。
解法1:递归
/**
* 思路:
* map建立kv关系,k数字,vList存储字母
* String转字符数组
* 递归的往格子里放字母
*/
public List<String> letterCombinations(String digits) {
ArrayList<String> result = new ArrayList<>();
if (digits.equals(""))return result;
HashMap<Integer, List<Character>> map = new HashMap<>();
int num=0;
for (int i=2;i<= 9;i++){
ArrayList<Character> list = new ArrayList<>();
list.add((char) ('a'+num++));
list.add((char) ('a'+num++));
list.add((char) ('a'+num++));
if (i==7||i==9)list.add((char) ('a'+num++));
map.put(i,list);
}
char[] chars = digits.toCharArray();
recursive(map,chars,result,0,"");
return result;
}
private void recursive(HashMap<Integer, List<Character>> map, char[] chars, ArrayList<String> result, int lattice, String s) {
if (lattice==chars.length){
result.add(s);
return;
}
int num = chars[lattice] -'0';
List<Character> list = map.get(num);
for (char c:list){
recursive(map, chars, result, lattice+1, s+c);
}
}
时间复杂度:On
空间复杂度:On
解法2:迭代
/**
* 思路:
* map建立kv关系,k数字,vList存储字母
* String转字符数组
* queue存储所有组合
* 每次组合一个格子,之后在这个格子的基础上加入新的字符
* a
* b
* c
* ad
* ae
* af
* bd...
*/
public List<String> letterCombinations(String digits) {
LinkedList<String> queue = new LinkedList<String>();
if(digits.isEmpty()) return queue;
String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
queue.offer("");
for(int i =0; i<digits.length();i++){
// int x = Character.getNumericValue(digits.charAt(i));
int num = digits.charAt(i)-'0';
while(queue.peek().length()==i){
String s = queue.poll();
for(char c : mapping[num].toCharArray())
queue.offer(s+c);
}
}
return queue;
}
时间复杂度:On^2
空间复杂度:On
或者
public List<String> letterCombinations(String digits) {
LinkedList<String> queue = new LinkedList<>();
if (digits.equals(""))return queue;
queue.offer("");
HashMap<Integer, List<Character>> map = new HashMap<>();
int num=0;
for (int i=2;i<= 9;i++){
ArrayList<Character> list = new ArrayList<>();
list.add((char) ('a'+num++));
list.add((char) ('a'+num++));
list.add((char) ('a'+num++));
if (i==7||i==9)list.add((char) ('a'+num++));
map.put(i,list);
}
char[] chars = digits.toCharArray();
for (int i=0;i<chars.length;i++){
int size = queue.size();
List<Character> list = map.get(chars[i]-'0');
for (int j=0;j<size;j++){
String poll = queue.poll();
for (char c:list){
queue.offer(poll+c);
}
}
}
return queue;
}
时间复杂度:On^2
空间复杂度:On