题目描述

原题链接

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
image.png

示例 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

  1. const phoneObj = {
  2. '2': 'abc',
  3. '3': 'def',
  4. '4': 'ghi',
  5. '5': 'jkl',
  6. '6': 'mno',
  7. '7': 'pqrs',
  8. '8': 'tuv',
  9. '9': 'wxyz',
  10. }
  11. /**
  12. * @param {string} digits
  13. * @return {string[]}
  14. */
  15. var letterCombinations = function (digits) {
  16. if (digits.length === 0) {
  17. return [];
  18. }
  19. let result = [...phoneObj[digits[0]]];
  20. const len = digits.length;
  21. for (let i = 1; i < len; i++) {
  22. const str = phoneObj[digits[i]];
  23. let temp = [];
  24. for (let j = 0; j < str.length; j++) {
  25. const resLen = result.length;
  26. for (let k = 0; k < resLen; k++) {
  27. temp.push(result[k] + str[j]);
  28. }
  29. }
  30. result = temp;
  31. }
  32. return result;
  33. };

Java

  1. class Solution {
  2. public List<String> letterCombinations(String digits) {
  3. char[] digit=digits.toCharArray();
  4. List<String> lists=new ArrayList<>();
  5. int l= digit.length;
  6. if (l==0){
  7. return lists;
  8. }else {
  9. return def(digit,0,lists,l);
  10. }
  11. }
  12. public static List<String> def(char[] digit, int n, List<String> lists, int l) {
  13. int x = (int) digit[n] - 48;
  14. char[] results=null;
  15. if (x == 7) {
  16. results = new char[]{'p', 'q', 'r', 's'};
  17. } else if (x == 8) {
  18. results = new char[]{'t', 'u', 'v'};
  19. } else if (x == 9) {
  20. results = new char[]{'w', 'x', 'y', 'z'};
  21. } else {
  22. results = new char[]{(char) (3 * x + 91), (char) (3 * x + 92), (char) (3 * x + 93)};
  23. }
  24. List<String> list1 = new ArrayList<>();
  25. String r = null;
  26. int len= results.length;
  27. if (lists.size() == 0) {
  28. for (int j = 0; j < len; j++) {
  29. r = "" + results[j];
  30. list1.add(r);
  31. }
  32. } else {
  33. for (int i = 0; i < lists.size(); i++) {
  34. for (int j = 0; j < len; j++) {
  35. r = lists.get(i) + results[j];
  36. list1.add(r);
  37. }
  38. }
  39. }
  40. if (n == l - 1) {
  41. return list1;
  42. } else {
  43. return def(digit, n + 1, list1, l);
  44. }
  45. }
  46. }

更优解法

Java

JavaScript

  1. const letterCombinations = (digits) => {
  2. if (digits.length == 0) return [];
  3. const map = { '2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz' };
  4. const queue = [];
  5. queue.push('');
  6. for (let i = 0; i < digits.length; i++) { // bfs的层数,即digits的长度
  7. const levelSize = queue.length; // 当前层的节点个数
  8. for (let j = 0; j < levelSize; j++) { // 逐个让当前层的节点出列
  9. const curStr = queue.shift(); // 出列
  10. const letters = map[digits[i]];
  11. for (const l of letters) {
  12. queue.push(curStr + l); // 生成新的字母串入列
  13. }
  14. }
  15. }
  16. return queue; // 队列中全是最后一层生成的字母串
  17. };