[LeetCode]Letter Combinations of a Phone Number题解
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.
简单讲讲这道题的思路吧。一开始想到的方法是,由给定的digits字符串的每个字符,确定对应的若干个(3或4)字符,然后通过递归,从底层开始,每次将这一层的字符和vector中的字符串组合一下,再返回给上一层。
思路是挺清晰也挺简单的,不过c++实现过程中也遇到了一点困难。
- char转换成string的问题。递归最底层要实现这个,“”+ ch并不能做到转string,最后是用一个空的string,push_back字符得到想要的结果。
- digits的字符对应若干个字符的问题。由于太久没有写这些东西,脑子不是很清晰,一开始也写错了,最终跟这个相关的代码也是有些乱的。
第二种是非递归的方法,每次把数字对应的3或4个字符添加到结果集合中。
最后有给出python实现的代码,非递归,非常简单。
class Solution {
public:
vector<string> letterCombinations(string digits) {
return combine(digits,0);
}
std::vector<string> combine(string digits,int len){
vector<string> re,temp;
//threeOrFour:这个字符对应着几个字符;
//ext:为了7(对应4个字符)以后的数字对应字符都+了1而定义的int,值是0或1
int threeOrFour,ext;
if(digits[len] == '7' || digits[len] == '9'){
threeOrFour = 4;
}else{
threeOrFour = 3;
}
if(digits[len] > '7'){
ext = 1;
}else{
ext = 0;
}
//ch是该数字对应的第一个字符
char ch = (digits[len] - 48) * 3 + 91 + ext;
string empty = "";
if ( len < digits.size()){
temp = combine(digits,len+1);
}
//递归的最底层
if (len == digits.size() - 1){
string t;
for(int i = 0; i < threeOrFour; i++){
t = empty;
t.push_back(ch+i);
re.push_back(t);
}
return re;
}
else{
for (int i = 0; i < temp.size(); ++i){
for(int j = 0; j < threeOrFour; j++){
string str = empty;
str.push_back(ch + j);
re.push_back((str+temp[i]));
}
}
return re;
}
}
};
下面是修改之后,更加简洁的版本:
class Solution {
private:
string letters[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public:
vector<string> letterCombinations(string digits) {
return Mycombine(digits,0);
}
vector<string> Mycombine(string digits,int len){
std::vector<string> re, temp;
temp.push_back("");
if(digits.empty()) return re;
if(len < digits.size() - 1){
temp = Mycombine(digits,len+1);
}
string get = letters[toInt(digits[len])];
for (int i = 0; i < temp.size(); ++i){
for (int j = 0; j < get.size(); ++j){
string put ="";
put.push_back(get[j]);
put += temp[i];
re.push_back(put);
}
}
return re;
}
int toInt(char ch){
return ch - 48;
}
};
迭代方法:
class Solution {
private:
string letters[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public:
vector<string> letterCombinations(string digits) {
std::vector<string> re,temp;
if(digits.empty()) return re;
re.push_back("");
//temp.push_back("");
for(int i = 0; i < digits.size(); i++){
string get = letters[toInt(digits[i])];
for(int j = 0; j < re.size(); j++){
string t = re[j];
for(int k = 0; k < get.size(); k++){
string str = t;
str.push_back(get[k]);
temp.push_back(str);
}
}
re = temp;
temp.clear();
}
return re;
}
int toInt(char ch){
return ch - 48;
}
};
事实上,用python的话非常好实现,而且逻辑很清晰:
class Solution:
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if len(digits) == 0:
return []
re = ['']
chars = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
m = {i:[ch for ch in chars[i]] for i in range(0,10)}
data = [int(digits[i]) for i in range(len(digits)) ]
for i in data:
temp = []
for s in re:
for j in m[i]:
temp.append(s + j)
print(j)
re = temp
return re
[LeetCode]Letter Combinations of a Phone Number题解的更多相关文章
- LeetCode: Letter Combinations of a Phone Number 解题报告
Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...
- [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- LeetCode——Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- [LeetCode] Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- [LeetCode] Letter Combinations of a Phone Number(bfs)
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- LeetCode Letter Combinations of a Phone Number (DFS)
题意 Given a digit string, return all possible letter combinations that the number could represent. A ...
- [LeetCode] Letter Combinations of a Phone Number 回溯
Given a digit string, return all possible letter combinations that the number could represent. A map ...
- LeetCode Letter Combinations of a Phone Number 电话号码组合
题意:给一个电话号码,要求返回所有在手机上按键的组合,组合必须由键盘上号码的下方的字母组成. 思路:尼玛,一直RE,题意都不说0和1怎么办.DP解决. class Solution { public: ...
- leetcode Letter Combinations of a Phone Number python
class Solution(object): def letterCombinations(self, digits): """ :type digits: str : ...
随机推荐
- zTree第一章,纯静态
zTree v3.5 Demo 演示 http://www.treejs.cn/v3/demo.php#_101 ------------------------------------------- ...
- mysql 查看索引
查看索引 mysql> show index from tblname; mysql> show keys from tblname; · Table 表的名称. · Non_unique ...
- 3分钟解决MySQL 1032 主从错误(转)
转自 https://blog.51cto.com/suifu/1845457 3分钟解决MySQL 1032主从错误 Part1:写在最前 1032错误----现在生产库中好多数据,在从库误删了, ...
- jquery基础认知
who what触发 按钮 点击 (click)执行 div 动画 (animation) $(document).ready(functio ...
- set,env和export命令显示shell变量其区别,与环境变量扫盲(一)
种类: ♦ set : 用来显示本地变量,显示当前shell的变量,包括当前用户的变量 ♦ env : 用来显示环境变量,显示当前用户的变量. ♦ export: 用来显示和设置环 ...
- socketserver模块解析
socketserver模块是基于socket而来的模块,它是在socket的基础上进行了一层封装,并且实现并发等功能. 看看具体用法: x import sockets ...
- Bootstrap Table使用方法详解
http://www.jb51.net/article/89573.htm bootstrap-table使用总结 bootstrap-table是在bootstrap-table的基础上写出来的,专 ...
- Working with Metal—Overview
看完这个 WWDC 之后的总结. Metal 可以在单位时间内提供 10 倍的 draw call 调用. Background About Draw Call 每一次 draw call 调用都必须 ...
- 栈的理解和代码实现(java)
从数据结构的角度来看,其实栈也是线性表.特殊性在于栈和队列的基本操作是线性表操作的子集,栈是操作受限制的线性表. 栈的定义 栈是限定仅在表尾进行插入或者删除操作的线性表.对于一个栈来说,表尾端有着特殊 ...
- SVN服务器端环境搭建步骤
5.1 安装服务器端程序 yum install -y subversion 5.2 创建并配置版本库 创建版本库目录 mkdir -p /var/svn/repository 在版本库目录下创建具体 ...