一、题目还原
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
二、解题思路
构建每个数字对应的字符序列,利用队列思想,先进先出,循环遍历digits和相应字符序列,移除原先的旧的,一一组合,组成新的队列。
三、代码展示
① main函数
public static void main(String[] args) {
String digits = "234";
System.out.println(letterCombinations(digits));
}
② letterCombinations方法函数
public static List<String> letterCombinations(String digits) {
if(null == digits || digits.isEmpty() || "".equals(digits)){
return new ArrayList<String>();
}
String[] strArr={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
List <String> list = new ArrayList<>();
list.add("");
for(int i = 0 ; i < digits.length(); i ++){
int size = list.size();//一定要先获取长度,后面list会动态变化
for(int j = 0; j < size; j ++){
String s = list.remove(0);
for(int k = 0 ; k < strArr[Character.digit(digits.charAt(i), 10)].length() ; k ++){
list.add(s+strArr[Character.digit(digits.charAt(i), 10)].charAt(k));
}
}
}
return list;
}
控制台输出:
[adg, adh, adi, aeg, aeh, aei, afg, afh, afi, bdg, bdh, bdi, beg, beh, bei, bfg, bfh, bfi, cdg, cdh, cdi, ceg, ceh, cei, cfg, cfh, cfi]
Process finished with exit code 0
四、自我总结
LeetCode的第十七题,难度为中等,整体上思路还是比较清晰,由于循环层数较多,效率不是很高。
本题有个注意的地方,在进行二次循环时,一定要获得list的长度,进行循环,因为list在下面的操作中是实时变化的,长度也会变化。
- 博主最近也将刷题的代码上传到github中,欢迎各位大佬们指点一二
Github仓库地址:https://github.com/w735937076/LeetCode