Leetcode 17 Solution

This article provides solution to leetcode question 17 (letter-combinations-of-a-phone-number)

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

Thinking Process

Finding all the combinations means we’ll have to iterate all the cases without missing a single one. We typically do that with a DFS recursion.

Whenever we try to design a DFS algorithm, always do the following two things:

  • define the states
  • define the state transition tree

The state of the algorithm can be represented by (i, curr), where i is current index of digit, and curr means the current string formed.

  • Apparently, if i == len(digit), we reached to an end, we can append curr to the final result.
  • Otherwise, find out the matching characters, and for each of them, append it to curr str, and iterate for the index i + 1.

Time & Space Complexity

Assuming N is the length of digit

  • Time complexity: O(2^N)
  • Space complexity: O(N)

Solution

class Solution { vector<string> m_res; vector<string> m_chars;
public: void letterCombinations(const string& digits, int i, string& curr) { if (i == digits.size()) { if (curr.size() != 0) m_res.push_back(curr); return; }
int digit = digits[i] - '0';
for (const char& ch : m_chars[digit]) { curr += ch; letterCombinations(digits, i + 1, curr); curr = curr.substr(0, curr.size() - 1); } }
vector<string> letterCombinations(string digits) { m_chars.push_back(""); m_chars.push_back(""); m_chars.push_back("abc"); m_chars.push_back("def"); m_chars.push_back("ghi"); m_chars.push_back("jkl"); m_chars.push_back("mno"); m_chars.push_back("pqrs"); m_chars.push_back("tuv"); m_chars.push_back("wxyz");
string curr;
letterCombinations(digits, 0, curr); return m_res; } };