LeetCode in Elixir

17. Letter Combinations of a Phone Number

Medium

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent. Return the answer in any order.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example 1:

Input: digits = “23”

Output: [“ad”,”ae”,”af”,”bd”,”be”,”bf”,”cd”,”ce”,”cf”]

Example 2:

Input: digits = “”

Output: []

Example 3:

Input: digits = “2”

Output: [“a”,”b”,”c”]

Constraints:

Solution

defmodule Solution do
  @t9 (Enum.chunk_every(?a..?o, 3) ++ [~c"pqrs", ~c"tuv", ~c"wxyz"])
      |> Enum.with_index(2)
      |> Map.new(fn {a, n} -> {n, a} end)

  @spec letter_combinations(digits :: String.t()) :: [String.t()]
  def letter_combinations(""), do: []

  def letter_combinations(digits) do
    digits
    |> String.to_integer()
    |> Integer.digits()
    |> Enum.map(&Map.get(@t9, &1))
    |> Enum.reduce([~c""], fn l, acc ->
      for x <- acc,
          y <- l do
        x ++ [y]
      end
    end)
    |> Enum.map(&to_string/1)
  end
end