给定一个仅包含数字 2-9 的字符串,返回全部它能表示的字母组合。java
给出数字到字母的映射以下(与电话按键相同)。注意 1 不对应任何字母。git
示例:网络
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,可是你能够任意选择答案输出的顺序。app
来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。spa
审题:code
给定的数字,表明几个字母,循环遍历可能性。leetcode
思考:rem
将每一个数字表明的字母遍历,最后求结果。字符串
解题:get
方法一:回溯,将第一次的结果做为参数继续调用这个方法,依次调用,直到跳出。
回溯本质上是,一个一个的找出来结果,而不是每次找结果的第一个。这里须要注意。
backtrack(combination + letter, next_digits.substring(1));
Map<String, String> phone = new HashMap<String, 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"); } }; List<String> output = new ArrayList<String>(); // 首先第一个数字循环,循环的过程当中调用第二个循环,第二个循环走完,再进行第一个循环的下一个循环。 public void backtrack(String combination, String next_digits) { // digits数字 check检查 still仍然 // if there is no more digits to check if (next_digits.length() == 0) { // done结束 // the combination is done output.add(combination); } // if there are still digits to check else { // iterate over all letters which map // the next available digit // 获取数字中的第一个数 String digit = next_digits.substring(0, 1); // 数字对应的字母组 String letters = phone.get(digit); // 遍历字母组 for (int i = 0; i < letters.length(); i++) { // 单个字母。 String letter = phone.get(digit).substring(i, i + 1); // 当前字母追加到组合中 // append the current letter to the combination // and proceed to the next digits // 字母拼接。 .substring(1)删去第一个已经遍历过的数字。 backtrack(combination + letter, next_digits.substring(1)); } } } public List<String> letterCombinations(String digits) { if (digits.length() != 0) backtrack("", digits); return output; }
方法二:
public List<String> letterCombinationsIII(String digits) { LinkedList<String> ans = new LinkedList<String>(); if(digits.isEmpty()) return ans; String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; ans.add(""); //ans.peek(),返回list第一个的值,若是第一个值的长度和数字的长度相同,说明已经循结束了。 while(ans.peek().length()!=digits.length()){ //若是没有结束,就须要删除第一个,须要继续拼接后边的数字。 String remove = ans.remove(); //找到remove的这个数字对应的字母接下来应该拼接的。若是只有两个数字,remove必定是只有一个字母, //[digits.charAt(remove.length())-'0']将得到第二个数字。找到对应的字母列。遍历 String map = mapping[digits.charAt(remove.length())-'0']; for(char c: map.toCharArray()){ //继续拼接。 ans.addLast(remove+c); } } return ans; }
知识点:
回溯,LinkedList的特性。