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

25 篇文章 0 订阅
25 篇文章 0 订阅

题目

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;
    }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值