leetcode相关C++算法解答: https://github.com/Nereus-Minos/C_plus_plus-leetcode
题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
实例:
输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
思路:
1.特殊情况为“”则返回{}
2. 首先求出返回值的总容量,分配好空间;
3.使用一个中间数组temp辅助组合;temp存放的是上一次res组合的数据,根据temp,在res重新组合数据。
4.例如“23”:
第一步我们会得到capacity=9;然后res分配9个空间
当digits[i]‘2’,temp根据res分配一个空间为空,最后res=[a,b,c];
当digits[i]‘3’,temp=[a,b,c],res=[aa,ab,ac,ba,bb,bc,ca,cb,cc]
代码:
class Solution {
public:
vector<string> letterCombinations(string digits) {
//特殊情况
if(digits.size()==0) return {};
//思路:建立map映射关系
map<char, string>a;
a.insert(pair<int,string>('2', "abc"));
a.insert(pair<int,string>('3', "def"));
a.insert(pair<int,string>('4', "ghi"));
a.insert(pair<int,string>('5', "jkl"));
a.insert(pair<int,string>('6', "mno"));
a.insert(pair<int,string>('7', "pqrs"));
a.insert(pair<int,string>('8', "tuv"));
a.insert(pair<int,string>('9', "wxyz"));
int i, j, k, index, cap = 1;
vector<string> ret, temp;
char c;
//求出总容量
for(i = 0; i < digits.length(); i++)
{
if(digits[i] != '7' && digits[i] != '9')
cap *= 3;
else
cap *= 4;
}
ret.resize(cap);
//将所有组合求出
cap = 1;
for(i = 0; i < digits.length(); i++)
{
index = 0;
temp.assign(ret.begin(),ret.begin()+cap);
for(j = 0; j < cap; j++)
{
for(k = 0; k < a[digits[i]].size(); k++)
{
c = a[digits[i]][k];
ret[index] = temp[j] + c;
index++;
}
}
cap *= a[digits[i]].size();
}
return ret;
}
};