力扣第17题电话号码的字母组合
一、题目:17.
二、题目解析:
改题主要就是让我们找出数字对应字符的组合问题,这个排列组合可以用树的形式表示出来,说白了就是把根结点到叶子结点上的每一条路径的所有字符加起来。
从而问题就被转换成了从根结点到叶子结点一共有多少条路径:
三、代码如下:
public List<String> letterCombinations(String digits) { //使用一个集合来存储所有的字母组合结果 List<String> combinations = new ArrayList<>(); if (digits == null || digits.length() == 0) return combinations; //将号码字母对应关系存储进Map //存储为数组更好操作 HashMap<Character, String> map = new HashMap<Character, String>() { { put(2, "abc"); put(3, "def"); put(4, "ghi"); put(5, "jkl"); put(6, "mno"); put(7, "pqrs"); put(8, "tuv"); put(9, "wxyz"); }}; //回溯 backTracking(combinations,map,0,digits,new StringBuilder()); return combinations; } private void backTracking(List<String> combinations,Map<Character,String> phoneMap,int index,String digits,StringBuilder sb) { //递归到叶子结点,找到一个结果,则加到结果集 if(index == digits.length()){ combinations.add(sb.toString()); }else { char c = digits.charAt(index); String letters = phoneMap.get(c); int length = letters.length(); for (int i = 0; i < length ; i++) { sb.append(letters.charAt(i)); backTracking(combinations,phoneMap,index+1,digits,sb); //递归到一个叶子节点后,需要找下一个组合,这里开始回溯 sb.deleteCharAt(index); } } }
四、测试
五、结束