题目描述
给定一个仅包含数字 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’] 的一个数字。
 
个人解法
JavaScript
const phoneObj = {'2': 'abc','3': 'def','4': 'ghi','5': 'jkl','6': 'mno','7': 'pqrs','8': 'tuv','9': 'wxyz',}/*** @param {string} digits* @return {string[]}*/var letterCombinations = function (digits) {if (digits.length === 0) {return [];}let result = [...phoneObj[digits[0]]];const len = digits.length;for (let i = 1; i < len; i++) {const str = phoneObj[digits[i]];let temp = [];for (let j = 0; j < str.length; j++) {const resLen = result.length;for (let k = 0; k < resLen; k++) {temp.push(result[k] + str[j]);}}result = temp;}return result;};
Java
class Solution {public List<String> letterCombinations(String digits) {char[] digit=digits.toCharArray();List<String> lists=new ArrayList<>();int l= digit.length;if (l==0){return lists;}else {return def(digit,0,lists,l);}}public static List<String> def(char[] digit, int n, List<String> lists, int l) {int x = (int) digit[n] - 48;char[] results=null;if (x == 7) {results = new char[]{'p', 'q', 'r', 's'};} else if (x == 8) {results = new char[]{'t', 'u', 'v'};} else if (x == 9) {results = new char[]{'w', 'x', 'y', 'z'};} else {results = new char[]{(char) (3 * x + 91), (char) (3 * x + 92), (char) (3 * x + 93)};}List<String> list1 = new ArrayList<>();String r = null;int len= results.length;if (lists.size() == 0) {for (int j = 0; j < len; j++) {r = "" + results[j];list1.add(r);}} else {for (int i = 0; i < lists.size(); i++) {for (int j = 0; j < len; j++) {r = lists.get(i) + results[j];list1.add(r);}}}if (n == l - 1) {return list1;} else {return def(digit, n + 1, list1, l);}}}
更优解法
Java
JavaScript
const letterCombinations = (digits) => {if (digits.length == 0) return [];const map = { '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz' };const queue = [];queue.push('');for (let i = 0; i < digits.length; i++) { // bfs的层数,即digits的长度const levelSize = queue.length; // 当前层的节点个数for (let j = 0; j < levelSize; j++) { // 逐个让当前层的节点出列const curStr = queue.shift(); // 出列const letters = map[digits[i]];for (const l of letters) {queue.push(curStr + l); // 生成新的字母串入列}}}return queue; // 队列中全是最后一层生成的字母串};
