问题简介
编程思路
题目理解起来并不复杂,但是由于digits.length是不定的,而且长度<=4,因此,大方向上我们选择递归来处理这个问题。
- 在处理上,主要是关注digits的长度,因此首先要建立对于数字与字母的转换函数。
- 第二,就是要有承载的结果,先要传递当前的所有计算结果,然后再累加上剩余的字符串的第一个字符所组合的函数。
- 在实现上result变量承担着在中间过程是保存之前所有数字位的结果,然后,要把其内容全部保存在exists,然后进行遍历,重新组合结果。
代码实现
AC版本
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<>();
combination(digits, result);
return result;
}
private void combination(String digits, List<String> result) {
if (digits.isEmpty()) {
return;
}
String first = digits.substring(0, 1);
String last = digits.substring(1);
Map<String, String> transfer = getTransfer();
String strs = transfer.get(first);
ArrayList<String> exists = new ArrayList<>(result);
result.clear();
for (int i=0; i<strs.length(); i++) {
if (!exists.isEmpty()) {
for (String exist : exists) {
result.add(exist + Character.toString(strs.charAt(i)));
}
} else {
result.add(Character.toString(strs.charAt(i)));
}
}
combination(last, result);
}
注意:在递归过程中传递了List result,则我们必须在递归函数中直接修改该变量,而不能重新new出来一个变量,因为在函数中创建的list是无法带出函数之外的。
总结
这还是头一次使用递归解决问题,想想也挺不错的。开心。今天是11号,还有两天就要回杭州了,新的一年就要展开了画卷。希望这一年里能够心想事成。