Letter Combinations of a Phone Number

来源:互联网 发布:禁止软件打开浏览器 编辑:程序博客网 时间:2024/04/29 05:12

1.问题描述

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"].
2.解题思路

其实按照其意思来说,这是一道排列组合的题目,就是变化其中某一个字符,和其他字符的组合形成的全部字符串。我当时第一反应就是把一个数字转换成这个数字对应的第一个字母,比如说得到的数字串是“456”,那么转化为对应的字符就是“gjm”,接下来的问题就是把gjm中每个字母进行排列组合的问题了。我们可以这样想:“gjm”的变化组合字符串的全部个数之和为:

v1 = “gjm”的后两个字母变化的组合字符串个数+

v2 = “hjm”后两个字母变化的组合字符串个数+

v3 = “ljm”后两个字母变化的组合字符串个数

那么全部的字符串就是v1Uv2Uv3。

于是对于“gjm”来说,我们求它变化组合字符串个数为:

x1 = “gjm”的最后一个字母组合变化的个数+

x2 = “gkm”的最后一个字母组合变化的个数+

x3 = “glm”的最后一个字母组合变化的个数

,于是“gjm”的全部字符个数就是x1Ux2Ux3,说到这里,我想你已经知道了我的做法了,没错,就是从第一个字母到最后一个字母进行递归求解,直到最后一个字母后结束。

3.代码实现

#include<algorithm>#include<iterator>class Solution {public://该函数把对应的数字字符转换为第一个字母字符char numToChar(const char n){switch (n){case '2':return 'a';case '3':return 'd';case '4':return 'g';case '5':return 'j';case '6':return 'm';case '7':return 'p';case '8':return 't';case '9':return 'w';case '0':return ' ';default:return ' ';}}/*这个函数求解每一个字母的变化次数,数字按键中7和9上的字母是4个,因此需要迭代四次而按键0上只有一个空格,所以其迭代次数是1,其他按键字母有3个,因此迭代次数是3,1号键直接忽略*/int getCount(const char x){int count;if (x == 'w' || x == 'p')count = 4;else if (x == ' ')count = 1;elsecount = 3;return count;}/*该函数递归求解字符排列组合,curIndex表示当前进行变化的字母下标s表示进行变换的字符串*/std::vector<string> getCombination(string s, unsigned curIndex){std::vector<string> v;//count是每一个字母应该变化的次数int count = 0;/*如果是最后一个字母,则直接对最后一个字母进行变换相应次数,然后将可能的变化组合放到v中,然后返回v*/if (s.size() == curIndex + 1){count = getCount(s.at(curIndex));//x保存当前变化的字母char x = s.at(curIndex);for (int i = 0; i != count; ++i){s.at(curIndex) = static_cast<char>(x + i);v.push_back(s);}}else{count = getCount(s.at(curIndex));//vt保存每次变化的中间结果std::vector<std::string> vt;//x保存当前变化的字母,char x = s.at(curIndex);for (int i = 0; i != count; ++i){//对s的字符进行变换,然后保存得到的变化结果,然后把结果放到v中s.at(curIndex) = static_cast<char>(x + i);vt = std::move(getCombination(s, curIndex + 1));copy(vt.begin(), vt.end(), std::back_inserter(v));}}return v;}std::vector<string> letterCombinations(string digits){if (digits == "")return std::vector<string>{};string rslt;//先将digist中每一个元素转换为对应第一个字母for (auto &e : digits){rslt += numToChar(e);}return getCombination(rslt, 0);}};


0 0
原创粉丝点击