电话号码的字母组合
题目
给一个不包含01的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。
下图的手机按键图,就表示了每个数字可以代表的字母。
注意事项
以上的答案是按照词典编撰顺序进行输出的,不过,在做本题时,你也可以任意选择你喜欢的输出顺序。样例
给定 “23”
返回 [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]题解
典型的回溯法,参看之前的类似问题。
public class Solution {
/**
* @param digits A digital string
* @return all posible letter combinations
*/
public ArrayList<String> letterCombinations(String digits) {
String[][] map = {{"a","b","c","-"},
{"d","e","f","-"},
{"g","h","i","-"},
{"j","k","l","-"},
{"m","n","o","-"},
{"p","q","r","s"},
{"t","u","v","-"},
{"w","x","y","z"}};
ArrayList<String> res = new ArrayList<String>();
if (digits.length() > 0)
{
find(map,digits,res,new StringBuilder(),0);
}
return res;
}
private void find(String[][] map,String digits,ArrayList<String> res,StringBuilder sb,int index)
{
if (sb.length() == digits.length())
{
res.add(sb.toString());
return;
}
String[] arr = map[Integer.valueOf(digits.substring(index,index+1))-2];
for (int i=0;i<arr.length && !arr[i].equals("-");i++)
{
sb.append(arr[i]);
find(map,digits,res,sb,index+1);
sb.deleteCharAt(sb.length()-1);
}
}
}
Last Update 2016.11.17