LeetCode 17. 电话号码的字母组合
1.回溯算法
package LeetCode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
public static void main(String[] args) {
Solution a=new Solution();
List<String> res= a.letterCombinations("23");
System.out.println(res);
}
List<Character>list=new ArrayList<>();
HashMap<Character,String>map=new HashMap<>();
List<String>res=new ArrayList<String>();
public List<String> letterCombinations(String digits) {
if(digits==null||digits.isEmpty()) return res;
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
helper(digits,0);
return res;
}
public void helper(String digits, int start) {
if (list.size() == digits.length()) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
res.add(sb.toString());
return;
}
Character digit = digits.charAt(start); // 如果list.size()!==digits.length() 从数字的第一个数开始添加,进行回溯 23 “ab” "ad"等
String letters = map.get(digit); //23
for (int i = 0; i < letters.length(); i++) { // letters="abc" letters="def"
//如果digits=23,先得到2,然后获取2的“abc”,通过helper不断递归, 执行的顺序为 a->d,a->e,a->f,(通过start + 1),然后删除a,从2数字的b开始,一次向后递归
// 当条件满足list.size() == digits.length() 即为要找到的结果
list.add(letters.charAt(i));
helper(digits, start + 1);
list.remove(list.size() - 1);
}
}
}