17. 电话号码的字母组合 Java
Posted 可持续化发展
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17. 电话号码的字母组合 Java相关的知识,希望对你有一定的参考价值。
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
自己画画图,举个例子。就可以看出。它是DFS。
这道题和
46. 全排列,字节后端一面机试_菼执的博客-CSDN博客这道题有点类似,
但区别是:
46.全排列 是这个数字在树的这一层用了之后,下层就不能再用这个数了。
即 即树中上下 层次的数字之间相关。
所以,要用一个布尔数组来记录当前数字是否已经用过了。
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 加上这样的返回结果,得用LIst<List<Integer>>来装。
所以是 DFS + 回溯算法。下面是显示回溯(很明显的那种)
path.add(nums[i]); used[i] = true; dfs(nums, len, depth + 1, path, used, res); //下面两行代码发生 【回溯】,回溯发生在从深层节点 回到 浅层节点 的过程中, //代码形式上和递归之前是对称的。 used[i] = false; path.remove(path.size() -1);
17. 电话号码的字母组合 是当前字母在这一层用了之后,用了就用了。下层是不相关的字母。即树中不同层次的字母之间不相关。
["ad","ae","af","bd","be","bf","cd","ce","cf"] 这样的返回结果用List<String> 装,
下面是隐式回溯(没有对称的写法,不太明显,不能一眼看出)
dfs(digits, u + 1, path + str.charAt(i), ans);
这样的写法已经隐藏了回溯了。
也是 DFS+回溯算法。
破解版
import java.util.ArrayList;
import java.util.List;
class Solution {
static String[] strs = new String[]{
"", "", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"
};
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<>();
//判空
if (digits.isEmpty()) return ans;
dfs(digits, 0, "", ans);
return ans;
}
/**
* @Author: zcm
* @DateTime: 2021/11/1 下午7:17
* @Params: [输入的数字串, 当前处理的数字在数字串中的索引, 拼接的结果, 结果集]
* @Return void
* @Description: TODO
*/
public static void dfs(String digits, int u, String path, List<String> ans) {
if (u == digits.length())
ans.add(path);
else {
//将当前一位数字 转换为 对应的 字符串str
int pos = digits.charAt(u) - '0';
String str = strs[pos];
for (int i = 0; i < str.length(); i++) {
dfs(digits, u + 1, path + str.charAt(i), ans);
}
}
}
}
纯净版
import java.util.ArrayList;
import java.util.List;
class Solution {
static String[] strs = new String[]{
"", "", "abc", "def",
"ghi", "jkl", "mno",
"pqrs", "tuv", "wxyz"
};
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<>();
if (digits.isEmpty()) return ans;
dfs(digits, 0, "", ans);
return ans;
}
public static void dfs(String digits, int u, String path, List<String> ans) {
if (u == digits.length())
ans.add(path);
else {
int pos = digits.charAt(u) - '0';
String str = strs[pos];
for (int i = 0; i < str.length(); i++) {
dfs(digits, u + 1, path + str.charAt(i), ans);
}
}
}
}
以上是关于17. 电话号码的字母组合 Java的主要内容,如果未能解决你的问题,请参考以下文章