leetcode(力扣)第十七题:电话号码的字母组合_C++

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])).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值