问题描述
问题分析
分析题目,递归虽然简单,但是消耗了额外的空间,故还是选择遍历的办法。思路如下:
每一次添加一个字母,把之前已经添加过的作为一个整体,再和新添加的字母组合(注意删去低维元素)。
解法:
Java代码
class Solution {
public List<String> letterCombinations(String digits) {
String[] repository = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
List<String> result = new ArrayList<String>();
if (digits.length() == 0){return result;}
//处理第一个数字
int cur = Integer.parseInt(digits.substring(0, 1));
for (int i = 0; i < repository[cur - 2].length(); i++) {
result.add(repository[cur - 2].substring(i, i+1));
}
//处理遍历之后的数字
for (int i = 1; i < digits.length(); i++) {
cur = Integer.parseInt(digits.substring(i, i+1));
int len = result.size();
for (int j = 0; j < len; j++) {
for (int k = 1; k < repository[cur - 2].length(); k++) {
result.add(result.get(j) + repository[cur - 2].substring(k, k+1));
}
result.set(j, result.get(j) + repository[cur - 2].substring(0, 1));//去掉低维组合
}
}
return result;
}
}
结果分析
以上代码的执行结果:
执行时间 | 内存消耗 |
---|---|
2ms | 35.4MB |