电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
解法:
p1:回溯(循环递归)
//回溯(循环递归)
String[] letter_map = {" ", "*", "abc", "def", "ghi", "jkl", "mno","pqrs", "tuv","wxyz"};
List<String> ans = new ArrayList<>();
public List<String> letterCombinations1(String digits) {
if(digits == null || digits.length() == 0){
return new ArrayList<String>();
}
iterStr(digits, "", 0); //递归函数
return ans;
}
//不能为static
public void iterStr(String digits, String letter, int index){
if(index == digits.length()){ //边界条件
ans.add(letter); //循环到末尾,加入结果列表
return;
}
char c = digits.charAt(index); //定位到digits[i],即找到目前应该遍历那个数字包含的字母
int pos = c - '0'; //找到数字在数组中位置
String str = letter_map[pos]; //"abc" 或 “def”等
for(int i = 0; i < str.length(); i++){ //开始循环遍历“def”
iterStr(digits, letter+str.charAt(i), index+1);
}
}
p2: 队列表示
将第一位置的字符加入队列,然后取出之后加入下一个位置的字符组合之后再加入队列,循环
//队列表示
public List<String> letterCombinations(String digits){
if(digits == null || digits.length() == 0){
return new ArrayList<String>();
}
//Queue<String> queue = new LinkedList<>();
//直接用list就可以
List<String> queue = new ArrayList<>();
queue.add("");
//三层循环,第一层循环digits,第二层循环队列大小size, 第三层循环当前字符串中每一个字符选一个
for(int k = 0; k < digits.length(); k++){
int size = queue.size();
char c = digits.charAt(k);
int pos = c - '0';
String str = letter_map[pos];
for(int i = 0; i < size; i++){
String s = queue.remove(0); //注意remove(0)
for(int j = 0; j < str.length(); j++){
queue.add(s+str.charAt(j));
}
}
}
return queue;
}