题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例
输入: “23”
输出: [“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
思路
- 首先,要对输入做非空判断,如果输入是空字符串,则直接将未赋值的List< String > 返回。笔者在开始做的时候返回的是null,这个是不对的,应该是空的List< String >集合才对。
- 在遍历数字字符的过程之前,要对集合的长度进行判断,防止首次遍历时集合结果为空,导致始终无法进入循环。
- 不要使用foreach()进行遍历,因为foreach遍历的过程中,因为遍历过程中集合的长度在不断增加,这样遍历会无法终止,最终导致内存不足错误。也不要在使用for()循环时将遍历条件设置为类似i < list.size()的形式,道理无异。
- 在每次遍历结束后,要将集合之前的元素清除掉。可以采用每次都清理集合第一个元素,这样每次清理之后集合第二个元素自动填补到第一个位置,清理集合起始大小的次数即可。
代码
public class Q017_letterCombinations {
List<String> result = new ArrayList<>();
public List<String> letterCombinations(String digits) {
char[] charArr = digits.toCharArray();
int length = charArr.length;
if(length == 0 ) return result;
for(int i = 0; i < length; i++){
traverse(result, charArr[i] - '0');
}
return result;
}
public List<String> traverse(List<String> result, int num){
int size = result.size();
if(num == 2){
if(size == 0){
result.add("a");
result.add("b");
result.add("c");
return result;
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "a");
result.add(s + "b");
result.add(s + "c");
}
}
if(num == 3){
if(size == 0){
result.add("d");
result.add("e");
result.add("f");
return result;
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "d");
result.add(s + "e");
result.add(s + "f");
}
}
if(num == 4){
if(size == 0){
result.add("g");
result.add("h");
result.add("i");
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "g");
result.add(s + "h");
result.add(s + "i");
}
}
if(num == 5){
if(size == 0){
result.add("j");
result.add("k");
result.add("l");
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "j");
result.add(s + "k");
result.add(s + "l");
}
}
if(num == 6){
if(size == 0){
result.add("m");
result.add("n");
result.add("o");
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "m");
result.add(s + "n");
result.add(s + "o");
}
}
if(num == 7){
if(size == 0){
result.add("p");
result.add("q");
result.add("r");
result.add("s");
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "p");
result.add(s + "q");
result.add(s + "r");
result.add(s + "s");
}
}
if(num == 8){
if(size == 0){
result.add("t");
result.add("u");
result.add("v");
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "t");
result.add(s + "u");
result.add(s + "v");
}
}
if(num == 9){
if(size == 0){
result.add("w");
result.add("x");
result.add("y");
result.add("z");
}
for(int i = 0; i < size; i++){
String s = result.get(i);
result.add(s + "w");
result.add(s + "x");
result.add(s + "y");
result.add(s + "z");
}
}
for(int i = 0; i < size; i++){
result.remove(0);
}
return result;
}
}