class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string>res;
map<int,string>mp;
mp[2]="abc";
mp[3]="def";
mp[4]="ghi";
mp[5]="jkl";
mp[6]="mno";
mp[7]="pqrs";
mp[8]="tuv";
mp[9]="wxyz";
if(digits.size()==1){
for(int i=0;i<mp[digits[0]].size();i++)
res[i]=mp[digits[0]][i];
return res;
}
for(int i=0;i<digits.size()-1;i++){
for(int j=i+1;j<digits.size();j++){
for(int k=0;k<mp[digits[i]].size();k++){
for(int l=0;l<mp[digits[j]].size();l++){
string str="";
str+=mp[digits[i]][k];
str+=mp[digits[j]][l];
res.push_back(str);
}
}
}
}
return res;
}
};
为什么输出为空?
题目https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
方法问题,最后回溯做
这段代码的输出为空是因为在处理长度大于等于2的数字字符串时,没有考虑到生成的组合不只有两个字符的情况。
以下是对该代码的优化方案:
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
map<char, string> mp;
mp['2'] = "abc";
mp['3'] = "def";
mp['4'] = "ghi";
mp['5'] = "jkl";
mp['6'] = "mno";
mp['7'] = "pqrs";
mp['8'] = "tuv";
mp['9'] = "wxyz";
if(digits.size() == 0){
return res;
}
backtrack(digits, mp, res, "", 0);
return res;
}
void backtrack(string digits, map<char, string>& mp, vector<string>& res, string curr, int index){
if(index == digits.size()){
res.push_back(curr);
return;
}
string letters = mp[digits[index]];
for(int i=0; i<letters.size(); i++){
curr += letters[i];
backtrack(digits, mp, res, curr, index+1);
curr.pop_back();
}
}
};
优化后的代码使用回溯法来生成所有可能的组合,每次将一个数字对应的所有字母组合添加到当前结果中,然后递归地处理下一个数字。当处理完所有数字后,将当前结果添加到最终结果中。
代码的优化点如下: 1. 将数字映射表的类型改为map<char, string>
,以便根据数字字符获取相应的字母字符串。 2. 使用递归回溯的方式生成所有可能的组合。 3. 将digits.size() == 1
的情况合并到主函数中,避免重复处理。
优化后的代码对于任意长度的数字字符串都能正确输出字母组合。