天天看點

17. Letter Combinations of a Phone Number

package LeetCode_17

/**
 * 17. Letter Combinations of a Phone Number
 * https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/
 *
 * Given a string containing digits from 2-9 inclusive,
 * return all possible letter combinations that the number could represent.
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:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
 * */
class Solution {
    /*
    * solution: backtracking + dfs;
    * Time complexity:O(4^n), because each button has 4 letter;
    * Space complexity:O(4^n), because result.add each calculate
    * */
    fun letterCombinations(digits: String): List<String> {
        //create a mapping for each button
        val map = arrayOf("", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz")
        val result = ArrayList<String>()
        val cur = StringBuilder()
        dfs(0, digits, cur, map, result)
        return result
    }

    private fun dfs(index: Int, digits: String, cur: StringBuilder, map: Array<String>, result: ArrayList<String>) {
        if (index == digits.length) {
            result.add(cur.toString())
            return
        }
        //set the index for get string from map
        val i = digits[index] - '0'
        //found out string for split
        val string = map.get(i)
        for (c in string) {
            cur.append(c.toString())
            dfs(index + 1, digits, cur, map, result)
            //clean last for next level
            cur.deleteCharAt(cur.lastIndex)
        }
    }
}