Skip to content

17. Letter Combinations of a Phone Number

https://leetcode.com/problems/letter-combinations-of-a-phone-number/

c++
class Solution {
public:
    vector<string> combile(vector<string> vec1, vector<char> vec2) {
        vector<string> result;
        if (vec1.empty()) {
            for (auto& c : vec2) {
                result.emplace_back(string(1, c));
            }
            return result;
        }
        if (vec2.empty()) {
            return vec1;
        }
        for (auto& s : vec1) {
            for (auto& c : vec2) {
                result.emplace_back(s + c);
            }
        }
        return result;
    }
    vector<string> letterCombinations(string digits) {
        vector<vector<char>> vec = {
            {},
            {},
            {'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'}
        };
        vector<string> result;
        for (int i = 0; i < digits.length(); i++) {
            result = combile(result, vec[digits[i] - '0']);
        }
        return result;
    }
};
go
func letterCombinations(digits string) []string {
  arr := [][]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'},
  }
  combine := func(arr1 []string, arr2 []byte) (result []string) {
    if len(arr1) == 0 {
      for _, c := range arr2 {
        result = append(result, string(c))
      }
      return
    }
    if len(arr2) == 0 {
      return arr1
    }
    for _, c1 := range arr1 {
      for _, c2 := range arr2 {
        result = append(result, string(c1)+string(c2))
      }
    }
    return
  }

  var result []string
  for _, c := range digits {
    result = combine(result, arr[c-'0'])
  }
  return result
}
js
/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
  var table = [
    [],
    [],
    ['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']
  ]
  digits = digits.split('')
  var result = digits.reduce((ret, num) => {
    return combine(ret, table[num])
  }, [])
  return result

  function combine(arr1, arr2) {
    if (!arr1.length) {
      return arr2
    }
    if (!arr2.length) {
      return arr1
    }
    var result = []
    arr1.forEach(a => {
      arr2.forEach(b => {
        result.push(a + b)
      })
    })
    return result
  }
}
py
from functools import reduce


class Solution(object):

    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        table = [
            [],
            [],
            ['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']
        ]
        letters = [table[int(num)] for num in list(digits)]

        def combine(l1, l2):
            if not l1:
                return l2
            if not l2:
                return l1
            result = []
            for a in l1:
                for b in l2:
                    result.append(a + b)
            return result

        return reduce(combine, letters, [])