电话号码的字母组合Letter Combinations of a Phone Number

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.

image

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.

python的做法:

class Solution(object):
    def letterCombinations(self, digits):
        """
        :type digits: str
        :rtype: List[str]
        """
        dict_all = {"2":["a","b","c"],"3":["d","e","f"],"4":["g","h","i"],
                    "5":["j","k","l"],"6":["m","n","o"],"7":["p","q","r","s"],
                    "8":["t","u","v"],"9":["w","x","y","z"]}
        list_all = []
        for i in digits:
            list_all = self.result(list_all,dict_all[i])
        return list_all
    def result(self,list_a,list_b):
        list_res=[]
        if len(list_a)==0: return list_b
        elif len(list_b)==0: return list_a
        else:
            for i in list_a:
                for j in list_b:
                    list_res.append(i+j)
            return list_res

if __name__ == "__main__":
    a = Solution()
    print(a.letterCombinations("23"))

C++的做法:

http://www.cnblogs.com/grandyang/p/4452220.html
1、递归

在递归函数中我们首先判断level,如果跟digits中数字的个数相等了,我们将当前的组合加入结果res中,然后返回。否则我们通过digits中的数字到dict中取出字符串,然后遍历这个取出的字符串,将每个字符都加到当前的组合后面,并调用递归函数即可。

#include <iostream>
using namespace std;
#include <string>
#include <vector>

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        if(digits.empty()) return {};
        string dict[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<string> res;
        letterCombinations_result(digits,0,"",res,dict);
        return res;
    }
    // level表示是digits的第几个数字,out表示每个数字代表的字母拼接后的结果,但不是最终结果,是中间结果。res表示最终结果
    void letterCombinations_result(string digits,int level,string out,vector<string> &res,string dict[]){
    	if(level == digits.size()) {res.push_back(out); return;}
    	string str = dict[digits[level]-'0'];
    	level++;
    	for(int i=0; i<str.size(); i++){
    		letterCombinations_result(digits,level,out+str[i],res,dict);
    	}
    }
};

int main(){
	Solution S;
	vector<string> result= S.letterCombinations("23");
	for(int i=0; i<result.size(); i++)
		cout << result[i] << endl;
	return 0;
}

2、迭代

在遍历digits中所有的数字时,我们先建立一个临时的字符串数组t,然后跟上面解法的操作一样,通过数字到dict中取出字符串str,然后遍历取出字符串中的所有字符,再遍历当前结果res中的每一个字符串,将字符加到后面,并加入到临时字符串数组t中。取出的字符串str遍历完成后,将临时字符串数组赋值给结果res。

#include <iostream>
using namespace std;
#include <string>
#include <vector>

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        
        if(digits.empty()) return {};
        string dict[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<string> res={""};  //这里必须写成{""},先放一个空的字符串,否则最里面的for循环第一次循环进行不了
        string str;  //每个数字代表的字符串
        vector<string> t;  //t用于临时存结果,然后赋值给res,每次遍历digits前要进行清空t。
        for(int i=0; i<digits.size(); i++){
            str = dict[digits[i]-'0'];
            for(int j=0; j<str.size(); j++)
                for(int k=0; k<res.size();k++) 
                    t.push_back(res[k]+str[j]);
            res=t;
            t={};
        }
        return res;
    }
};

int main(){
	Solution S;
	vector<string> result= S.letterCombinations("23");
	for(int i=0; i<result.size(); i++)
		cout << result[i] << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值