【算法】17. 电话号码的字母组合(多语言实现)
【摘要】 17. 电话号码的字母组合:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 样例 1:输入: digits = "23" 输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"] 样例 2:输入: digits = "" 输出: ...
17. 电话号码的字母组合:
给定一个仅包含数字 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,回溯。
- 细节的地方在于字符串拼接,有些语言的字符串是不可变的,在字符串拼接上有可以优化的点。
题解
rust
const PHONE_MAP: &[&[char]] = &[&[], &[], &['a', 'b', 'c'], &['d', 'e', 'f'], &['g', 'h', 'i'], &['j', 'k', 'l'], &['m', 'n', 'o'], &['p', 'q', 'r', 's'], &['t', 'u', 'v'], &['w', 'x', 'y', 'z']];
impl Solution {
pub fn letter_combinations(digits: String) -> Vec<String> {
fn backtrack(ans: &mut Vec<String>, digits: &[u8], index: usize, buf: &mut Vec<u8>) {
if index == digits.len() {
ans.push(String::from_utf8(buf.clone()).unwrap());
} else {
let digit = (digits[index] - '0' as u8) as usize;
PHONE_MAP[digit].iter().for_each(|c| {
buf[index] = *c as u8;
backtrack(ans, digits, index + 1, buf);
});
}
}
let mut ans = Vec::new();
if digits.len() > 0 {
backtrack(&mut ans, digits.as_bytes(), 0, &mut vec![0; digits.len()]);
}
ans
}
}
go
var phoneMap [][]byte = [][]byte{{}, {}, {'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}, {'j', 'k', 'l'}, {'m', 'n', 'o'}, {'p', 'q', 'r', 's'}, {'t', 'u', 'v'}, {'w', 'x', 'y', 'z'}}
func letterCombinations(digits string) []string {
var ans []string
var backtrack func(int, []byte)
backtrack = func(index int, buf []byte) {
if index == len(digits) {
ans = append(ans, string(buf))
} else {
digit := digits[index]
for _, c := range phoneMap[digit-'0'] {
buf[index] = c
backtrack(index+1, buf)
}
}
}
if len(digits) > 0 {
backtrack(0, make([]byte, len(digits)))
}
return ans
}
c++
class Solution {
private:
unordered_map<char, string> phoneMap{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
void backtrack(vector<string> &ans, const string &digits, int index, string &buf) {
if (index == digits.length()) {
ans.emplace_back(buf);
} else {
char digit = digits[index];
for (const char &c: phoneMap.at(digit)) {
buf.push_back(c);
backtrack(ans, digits, index + 1, buf);
buf.pop_back();
}
}
}
public:
vector<string> letterCombinations(string digits) {
vector<string> ans;
if (digits.size() > 0) {
string buf;
backtrack(ans, digits, 0, buf);
}
return ans;
}
};
java
class Solution {
private static final char[][] PHONE_MAP = new char[][]{{},{},{'a','b','c'},{'d','e','f'},{'g','h','i'},{'j','k','l'},{'m','n','o'},{'p','q','r','s'},{'t','u','v'},{'w','x','y','z'}};
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<>();
if (digits.length() > 0) {
this.backtrack(ans, digits, 0, new char[digits.length()]);
}
return ans;
}
private void backtrack(List<String> ans, String digits, int index, char[] buf) {
if (index == digits.length()) {
ans.add(new String(buf));
} else {
int digit = digits.charAt(index) - '0';
for (char c : PHONE_MAP[digit]) {
buf[index] = c;
backtrack(ans, digits, index + 1, buf);
}
}
}
}
typescript
const phoneMap = {
2: 'abc',
3: 'def',
4: 'ghi',
5: 'jkl',
6: 'mno',
7: 'pqrs',
8: 'tuv',
9: 'wxyz',
};
function letterCombinations(digits: string): string[] {
let ans = [];
const backtrack = function (index: number, buf: string) {
if (index == digits.length) {
ans.push(buf);
} else {
const digit = digits[index];
for (const c of phoneMap[digit]) {
backtrack(index + 1, buf + c);
}
}
};
if (digits.length > 0) {
backtrack(0, "");
}
return ans;
};
python
class Solution:
PHONE_MAP = {
"2": "abc",
"3": "def",
"4": "ghi",
"5": "jkl",
"6": "mno",
"7": "pqrs",
"8": "tuv",
"9": "wxyz",
}
def letterCombinations(self, digits: str) -> List[str]:
def backtrack(index: int):
if index == len(digits):
ans.append("".join(buf))
else:
digit = digits[index]
for letter in Solution.PHONE_MAP[digit]:
buf.append(letter)
backtrack(index + 1)
buf.pop()
ans = list()
buf = list()
if len(digits) > 0:
backtrack(0)
return ans
非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://bbs.huaweicloud.com/community/usersnew/id_1628396583336561 博客原创~
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)