LeetCode 17电话号码的字母组合
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
我一开始想采用回溯的方法来做,但是再写一个函数会有很多变量要考虑,电话号码数字对应字符,存储List,回溯位置,已经有的字符等等
然后看到大佬用队列做的,再输入的字符里面每次拿出一个就变量一遍队列,重队列头拿出,尾放入加入的对数字的字符,
想想可能用进制的思想,每一位数应一个字符,超过字符在键盘上对应数字可能字符长度时就进位,然后后面的数位零
比如’23’,显示00也就是0得到ad,然后1就是ae ,2就时af 然后3就要进位变成10得到 bd
public class LeetCode_17 {
public static void main(String[] args) {
LeetCode_17 lc17=new LeetCode_17();
List<String> l=lc17.letterCombinations("23");
for(int i=0;i<l.size();i++) {
System.out.println(l.get(i));
}
}
public List<String> letterCombinations(String digits) {
LinkedList<String>ll=new LinkedList<>();
if(digits.length()==0) {
return ll;
}
char arr[][]= {{'a','b','c'},{'d','e','f'},{'g','h','l'},{'j','k','i'},{'m','n','o'}
,{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};
ll.add("");
for(int i=0;i<digits.length();i++) {
int x=ll.size();//队列长度 因为队列大小会变,所以要用变量存储而不能直接在for循环里
for(int j=0;j<x;j++) {
String s=ll.removeFirst(); // 拿出队列头部
int f=Integer.valueOf(digits.charAt(i))-50; //拿到的数字
//System.out.println(f);
for(int p=0;p<arr[f].length;p++) {
ll.addLast(s+arr[f][p]);
}
}
}
return ll;
}
}