突然发现回溯题最近考的好多,其实没啥技术含量
解法都在代码里,不懂就留言或者私信
class Solution {
public static final char[][] digitsCharArr = {
{},
{},
{'a','b','c'},/**数字2可以代表的字符 */
{'d','e','f'},
{'g','h','i'},
{'j','k','l'},
{'m','n','o'},
{'p','q','r','s'},
{'t','u','v'},
{'w','x','y','z'}};/**数字9可以代表的字符 */
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<>();
if(digits == null || digits.length() == 0) {
return ans;
}
char[] digitsArr = digits.toCharArray();
char[] path = new char[digitsArr.length];
process(digitsArr, ans, 0, path);
return ans;
}
public void process(char[] digits, List<String> ans, int curIndex, char[] path) {
/**到了越界的位置,所有的数都用完了 */
if(curIndex == digits.length) {
ans.add(String.valueOf(path));
return;
}
/**如果没有的话继续尝试curIndex位置的数字,我们可以从digitsCharArr中拿到它对应的字符
依次尝试每个字符,能拼出多少都加到ans里去*/
char[] curCharArr = digitsCharArr[digits[curIndex]-'0'];
for(char c : curCharArr) {
path[curIndex] = c;
process(digits, ans, curIndex + 1, path);
/** 理论上应该恢复现场,但是这里可以自动使用覆盖,也就不用恢复现场了*/
}
}
}
运行结果,不管是不是最优解,反正打败了100%