给出一个仅包含数字的字符串,给出所有可能的字母组合。
数字到字母的映射方式如下:(就像电话上数字和字母的映射一样)
Input:Digit string "23"Output:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].注意:虽然上述答案是按字典序排列的,但你的答案可以按任意的顺序给出
Input:Digit string "23"Output:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].注意:虽然上述答案是按字典序排列的,但你的答案可以按任意的顺序给出
"23"
["ad","ae","af","bd","be","bf","cd","ce","cf"]
ArrayList<String> res =new ArrayList<String>(); String[] map={"0","1","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; public ArrayList<String> letterCombinations (String digits) { // write code here int size = digits.length(); if(size<=0) { res.add(digits); return res; } StringBuffer sb= new StringBuffer(); helper(digits,0,sb); return res; } void helper(String digits,int index,StringBuffer sb) { if(index>=digits.length()) { res.add(sb.toString()); return; } int s = (int)digits.charAt(index)-'0'; for(int i=0;i<map[s].length();i++) { sb.append(map[s].charAt(i)); helper(digits,index+1,sb); sb=sb.deleteCharAt(sb.length()-1); } }
Java版本的回溯解法。
public ArrayList<String> letterCombinations (String digits) { // write code here traceBack(new StringBuffer(), 0, digits); return res; } // index为输入的数字字符串中的第几个数字 private void traceBack(StringBuffer str, int index, String digits) { if (index == digits.length()) { res.add(str.toString()); return; } char[] charArray = digits.toCharArray(); // 目前回溯到第几个数字 int num = Character.getNumericValue(charArray[index]); // 取出数字对应的字符串 String item = mapping[num]; for (char ch : item.toCharArray()) { str.append(ch); traceBack(str, index + 1, digits); str.deleteCharAt(str.length() - 1); } }
import java.util.HashMap; import java.util.ArrayList; public class Solution { ArrayList<String> res = new ArrayList<>(); String temp = ""; public ArrayList<String> letterCombinations(String digits) { if(digits.length() == 0 || digits == null){ res.add(""); return res; } HashMap<Character,String> map=new HashMap<>(); map.put('0',""); map.put('1',"");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"); res = combine(digits, 0, map); return res; } //回溯法 public ArrayList<String> combine(String digits, int start, HashMap<Character,String> map){ if(start == digits.length()){ res.add(temp); return res; } String str = map.get(digits.charAt(start)); for(int i = 0; i < str.length(); i++){ temp = temp + str.charAt(i); combine(digits, start + 1, map); temp = temp.substring(0, temp.length() - 1); } return res; } }
import java.util.*; public class Solution { public ArrayList<String> letterCombinations(String digits) { ArrayList<String> res = new ArrayList<String>(); HashMap<Character,char[]> map = new HashMap<Character,char[]>(); map.put('0',new char[]{' '}); map.put('2',new char[]{'a','b','c'}); map.put('3',new char[]{'d','e','f'}); map.put('4',new char[]{'g','h','i'}); map.put('5',new char[]{'j','k','l'}); map.put('6',new char[]{'m','n','o'}); map.put('7',new char[]{'p','q','r','s'}); map.put('8',new char[]{'t','u','v'}); map.put('9',new char[]{'w','x','y','z'}); getString(digits, 0, res, "", map); return res; } public void getString(String digits, int i, ArrayList<String> res, String str, HashMap<Character,char[]> map) { if(i < digits.length()) { if(map.containsKey(digits.charAt(i))) for(char c : map.get(digits.charAt(i))) { String tmp=str+c; getString(digits, i+1, res, tmp, map); } } else { res.add(str); } } }
public List<String> letterCombinations(String digits) { LinkedList< LinkedList<String> ans = new LinkedList<String>(); String[] mapping = new String[] {"0", "1", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; ans.add( ans.add(""); for(int i =0; i<digits.length();i++){ int x = Character.getNumericValue(digits.charAt(i)); while(ans.peek().length()==i){ String t = ans.remove(); for(char s : mapping[x].toCharArray()) ans.add(t+s); } } ans.add(t+s); } } return ans; } }