这是一道我刷题时遇到的一个题目,很简单,输入数字,输出这些数字构成的字符排列组合
由图片可以看出。
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Example:
Input: “23”
Output: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
一开始想的是直接多层for循环嵌套解决,但是嵌套的层数由数字的个数决定,事先并不清楚,所以该方法行不通。 后面看别人的解答 发现用LinkedList 每次把链表头部的元素弹出,在这个弹出字符串的尾部加上一个遍历到的数字所代表的字符 也相当于是多层for循环嵌套
例如 输入 87 ,首先 LinkedList 弹出字符串为""(空)(事先定义好),然后remove掉这个字符串,再把这个字符串尾部再加上’8’所代表的字符 ,再 add到这个链表中,此时LinkedList中的元素为 t u v,再重复上面操作 弹出第一个字符串为 t ,把它从 LinkedList中 remove ,再在 t 的后面加上 ‘7’ 代表的字符 ,再 add到链表中 此时链表的元素为 tp tq tr ts up uq ur … 重复这个过程直到遍历结束.
思路如上 实现代码:
public static List<String> letterCombinations(String digits) {
if(digits == null || digits.length() ==0){
return new ArrayList();
}
String[] map = new String[]{"0","1","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
LinkedList<String> r = new LinkedList();
r.add("");
for(int i=0;i<digits.length();i++){
int x = digits.charAt(i)-'0';
while(r.peek().length() == i){
String tempStr = r.removeFirst();
for(int j=0;j<map[x].length();j++){
r.add(tempStr+map[x].charAt(j));
}
}
}
return r;
}