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"].
知识补充:
vector类
vector<string> str;
str.empty();//判断数组str是否为空,为空返回true
str.pop_back();//是删除最后的元素,不是弹出最后一个元素,没有返回值
str.back();//这个可以返回最后一个元素
vector1.swap(vector2);//可以交换两个vector的值
类型转换
#include <sstream>
stringstream ss;
string s = "asda";//字符串型
int number;//整型
ss.clear();//如果重复使用一个stringstream,必须要先清空
ss<<s;
ss>>number;//转换完成
string s;//字符串型
int number = 123;//整型
ss<<number;
ss>>s;//反过来也可以
int num = digits[i]-'0';//也可以直接减去0的ASCII码,得到的就是整数值
字符串遍历
for(char c:string)
{
}
//相当于正常的for循环
reduce函数
python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。
def add_m(x,y):
return x+y
sum=reduce(add_m,(1,2,3,4,5,6,7))
print sum
#结果就是输出1+2+3+4+5+6+7的结果即28
当然,也可以用lambda的方法,更为简单:
sum=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7))
print sum
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
sum=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7),100)
print sum
#结果就是输出1+2+3+4+5+6+7的结果即128
在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce.
测试代码(c++):
vector<string> letterCombinations(string digits) {
vector<string> result;
vector<string> temporary;
stringstream ss;
string t = "";
int j = 0,phone_number=0;
string str[10] = {"", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
if(digits.empty())
{
return result;
}
for(int i=0;i<digits.length();i++)
{
ss<<digits[i];
ss>>phone_number;
ss.clear();
if(phone_number==0||phone_number==1)
{
return result;
}
if(result.empty())
{
while(j<str[phone_number-1].length())
{
result.push_back(t+str[phone_number-1][j]);
j++;
}
continue;
}
while(!result.empty())
{
t = result.back();
result.pop_back();
j = 0;
while(j<str[phone_number-1].length())
{
//t = t+str[i][j];
temporary.push_back(t+str[phone_number-1][j]);
j++;
}
}
result.swap(temporary);
}
return result;
}
性能:
参考答案(c++):
class Solution {
unordered_map<char,string> digitToLetter;
vector<string> result;
public:
void LetterCombinationsRecur(string digits, int digitStart, string& res)
{
if(digitStart==digits.size())
{
result.push_back(res);
return;
}
string alphabets = digitToLetter[digits[digitStart]];
for(char ch2:alphabets)
{
res[digitStart]=ch2;
LetterCombinationsRecur(digits,digitStart+1,res);
}
}
vector<string> letterCombinations(string digits) {
if(digits.empty()) return result;
digitToLetter['2']="abc";
digitToLetter['3']="def";
digitToLetter['4']="ghi";
digitToLetter['5']="jkl";
digitToLetter['6']="mno";
digitToLetter['7']="pqrs";
digitToLetter['8']="tuv";
digitToLetter['9']="wxyz";
string res (digits.size(),'\0');
LetterCombinationsRecur(digits,0,res);
return result;
}
};
性能:
参考答案(python):
def letterCombinations(self, digits):
if '' == digits: return []
kvmaps = {
'2': 'abc',
'3': 'def',
'4': 'ghi',
'5': 'jkl',
'6': 'mno',
'7': 'pqrs',
'8': 'tuv',
'9': 'wxyz'
}
return reduce(lambda acc, digit: [x + y for x in acc for y in kvmaps[digit]], digits, [''])
性能:
注:学会使用递归的思想提高效率