力扣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;
}