给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应

本题源自LeetCode

----------------------------------------------

思路:

·1 枚举回溯。

 1 将所有的对应关系构建为一个map

2 用回溯法求解

代码:

[html]  view plain  copy
  1. map<int,string> numToStr={{2,"abc"},{3,"def"},{4,"ghi"},{5,"jkl"},{6,"mno"},{7,"pqrs"},{8,"tuv"},{9,"wxyz"}};  
  2. ublic:  
  3.    vector<string> letterCombinations(string digits) {  
  4.        vector<string> result;  
  5.        string tmp="";  
  6.        if(digits.length()==0){  
  7.            result.push_back(tmp);  
  8.            return result;  
  9.        }  
  10.        backPath(result,digits,tmp,0);  
  11.        return result;  
  12.    }  
  13.      
  14.    void backPath(vector<string>& result,string digits,string tmp,int index){  
  15.        if(index==digits.length()){  
  16.            result.push_back(tmp);  
  17.            return;  
  18.        }  
  19.        int k=digits[index]-'0';  
  20.        for(int i=0;i<numToStr[k].length();i++){  
  21.            backPath(result,digits,tmp+numToStr[k][i],index+1);  
  22.        }  
  23.    }  

代码 2  非递归

[html]  view plain  copy
  1. vector<string> letterCombinations(string digits) {  
  2.        vector<string> result(1,"");  
  3.        map<int,string> numToStr={{2,"abc"},{3,"def"},{4,"ghi"},{5,"jkl"},{6,"mno"},{7,"pqrs"},{8,"tuv"},{9,"wxyz"}};  
  4.        for(int i=0;i<digits.size();i++){  
  5.            vector<string> tmp;  
  6.            for(int j=0;j<result.size();j++){  
  7.                int num=digits[i]-'0';  
  8.                for(int k=0;k<numToStr[num].size();k++)  
  9.                {  
  10.                    tmp.push_back(result[j]+numToStr[num][k]);  
  11.                }  
  12.            }  
  13.            result=tmp;  
  14.        }  
  15.        return result;  
  16.    }  


转自:http://blog.csdn.net/i_am_bird/article/details/78464870

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题可以使用回溯法来解决。回溯法是一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。 对于这道题,我们可以先建立一个数字字母的映射表,然后从字符串的第一个数字开始,对于每个数字,依次枚举它所对应的所有字母,将当前字母加入到结果字符串中,并递归处理下一个数字,直到处理完所有的数字。如果已经处理完了所有的数字,说明得到了一个合法的结果,将该结果加入到结果集中。之后将最后一个加入的字母从结果字符串中删除,回溯到上一个状态,继续枚举下一个字母。 具体实现可以参考下面的代码: ```python class Solution: def letterCombinations(self, digits: str) -> List[str]: if not digits: return [] phone_dict = {"2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"} res = [] def backtrack(cur_str, next_digits): if not next_digits: res.append(cur_str) return for letter in phone_dict[next_digits[0]]: backtrack(cur_str + letter, next_digits[1:]) backtrack("", digits) return res ``` 时间复杂度:O(3^m * 4^n),其中m是对应3个字母数字个数,n是对应4个字母数字个数。可以证明,总共的结果个数是O(3^m * 4^n)。 空间复杂度:O(m+n),递归栈的深度为m+n。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值