17.手机键盘字母组合

来源:互联网 发布:小米note软件搬家 编辑:程序博客网 时间:2024/04/30 09:41

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是否为空,为空返回truestr.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, [''])

性能:

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

原创粉丝点击