1. 程式人生 > >leetcode第17題——**Letter Combinations of a Phone Number

leetcode第17題——**Letter Combinations of a Phone Number

題目

Given a digit string, 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.

Input:Digit string "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.

思路

需要三層迴圈:最外層迴圈,遍歷數字串,一個數字對應一個相應的字串,如2對應“abc", 3對應"def";中間層迴圈,遍歷數字對應的字串,每個字元新加進res的字串裡;最裡層迴圈,遍歷已儲存的res連結串列的所有字串,每個字串都加上一個字元。雖然看上去有三層迴圈巢狀,但中間層迴圈最多也就遍歷四次(數字對應的字串長度最大為4),所以演算法的整體時間複雜度大概為O(n^2).

程式碼

Python

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        if len(digits) == 0:
            return []
        #按照鍵盤分佈,下標0-9分別對應字串
        digitLis = ["0","1","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
        res = [""]
        
        for num in digits:
            tempLis = []
            for ch in digitLis[int(num)]:
                for str in res:
                    tempLis.append(str + ch)
            res = tempLis
            
        return res

Java

public class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> res = new ArrayList<String>();
		int len = digits.length();
		if (len == 0) return res;
		
		//按照鍵盤分佈,初始化一個字串陣列,下標0-9分別對應指定的字串
		String[] digitArr = {"0","1","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
		res.add("");
		int i,j,k;
		for (i = 0;i < len;i++){
			List<String> tempLis = new ArrayList<String>();
			String iStr = digitArr[digits.charAt(i) - '0'];//找出數字對應的字串
			for (j = 0;j < iStr.length();j++)
				for (k = 0;k < res.size();k++)
					tempLis.add(res.get(k) + iStr.charAt(j));
			res = tempLis;
		}
		return res;
    }
}