力扣17 电话号码的字母组合

力扣17 电话号码的字母组合

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

输入输出示例

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]
输入:digits = "2"
输出:["a","b","c"]

解法一,使用hash存储,暴力解法


vector<string> createList(map<int,vector<char>>&hashList,int i,vector<string>&strList)
    {
        int length=strList.size();

        //建立一个临时的容器用以存储
        vector<string>tempList;

        //将字符串遍历,相加
        for(int index=0;index<length;index++)
        {
            for(auto j:hashList[i])
            {
                string temps;
                temps=j;
                tempList.push_back(strList[index]+temps);
            }
        }

        strList=tempList;        
        return   strList;

    }

    vector<string>letterCombinations(string digits)
    {   
        vector<string>resStr;
        vector<char>tempList;
        
        //建立hash表
        map<int,vector<char>>hashList;
        int count=0;
        int index=2;

        //建立hash表是的数字和字母进行一一对应
        for(char ch='a';ch<='z';ch++)
        {
            count++;
            tempList.push_back(ch);
            if(index!=7&&index!=9)
            {
                if(count==3)
                {
                    count=0;
                    hashList.insert(make_pair(index,tempList));
                    index++;
                    tempList.clear();
                }
            }
            else{
                if(count==4)
                {
                    count=0;
                    hashList.insert(make_pair(index,tempList));
                    index++;
                    tempList.clear();
                }
            }
        }

        //当输入的字符为空的时候,则直接跳出既可以
        if(digits=="")
        {
            return resStr;
        }


        //获取数字每个位上的数
        //注意这个得逆序查找
        int inputNum=stoi(digits);
        vector<int>num;
        
        while(inputNum)
        {
            num.push_back(inputNum%10);
            inputNum/=10;
        }

        int numLength=num.size();
        //将第一个数字的位置先存储进数组中
        for(auto i:hashList[num[numLength-1]])
        {
            string s;
            s=i;
            resStr.push_back(s);
        }   

        int i=numLength-1-1;

        //根据位数逐渐更新数组
        while(i>=0)
        {
            createList(hashList,num[i], resStr); 
            i--; 
        }
        return resStr;
    }

该算法的流程是首先建立存储手机数字和字母的键值对hash表,然后根据输入的数字,提取每个位的数字并加入到对应的数组中。接下来,是查找对应的数字在hash表中对应的值,然后用while循环将查找的结果逐个添加容器中,每次两两更新即可。使用hash表的效率会特别高,击败100%,让我小小得瑟一下。

在这里插入图片描述

解法二使用深度优先算法和回溯算法

    string tmp;
    vector<string>res;

    //定义了每个按键对应的值
    vector<string>board={"","","abc","def","ghi",
        "jkl","mno","pqrs","tuv","wxyz"};

    void DFS(int pos,string digits)
    {
        
        if(pos==digits.size())
        {
            res.push_back(tmp);
            return;
        }

        int num=digits[pos]-'0';
        for(int i=0;i<board[num].size();i++)
        {
            tmp.push_back(board[num][i]);
            DFS(pos+1,digits);
            tmp.pop_back();
        }
    }    




    //使用回溯算法实现
    vector<string>letterCombinations2(string digits)
    {
        //当输入的数据为空时,那么肯定不会返回
        if(digits.size()==0)
        {
            return res;
        }    
        DFS(0,digits);
        return res;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值