17.手机键盘字母组合

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()(必须是一个二元操作函数)先对集合中的第12个数据进行操作,得到的结果再与第三个数据用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, [''])

性能:

这里写图片描述
注:学会使用递归的思想提高效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值