class Solution {
public:
string NumCharTable[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int CharAm(char i){
if(i==57||i==55)return 4;
else return 3;
}
vector<string> letterCombinations(string digits){
if(digits=="")return vector<string>{};
int size=1,mul=1;
for(int i=0;i<digits.length();++i)
size*=CharAm(digits[i]);
vector<string> ans(size,digits);
for(int i=0;i<digits.length();++i){
int cur=0;
for(int j=0;j<size/(mul*CharAm(digits[i]));++j)
for(int k=0;k<CharAm(digits[i]);++k)
for(int l=0;l<mul;++l)
ans[cur++][i]=NumCharTable[digits[i]-50][k];
mul*=CharAm(digits[i]);
}
return ans;
}
};
做个表就是不一样(喜
由于固定长度,因此时间复杂度没有考虑的必要;就算不固定长度,由于必须填充那么多字母,也不存在什么重复填充的情况,因此时间复杂度还是没有考虑的必要。
把填充过程拆分成是四个循环:
第一个循环是每个字符串长度的循环,我先填所有的第一位,再填所有的第二位,以此类推。
最后一个循环是单个字母输出的循环,我单个字母一次性输出多少个,也就是mul。初始值为1。每次乘以上一个数字所能代表的字母数量。
倒二个循环是一个数字能代表几个字母,也就是CharAm(digits[i]).
第二个循环就是字符串总数/(mul*CharAm(digits[i])).