做第十七题的时候第一时间想到的是用vector存放字符串,但是没有unordered_map好用节省空间,而且还需要将字符串转换为整数
字符转换为整数最方便的方法就是char - ‘0’,例如:‘9’ - ‘0’ = 9
回溯的方法很简单,就是通过for循环加上递归的方法,这样很好的解决了种类太多的问题。
同样需要注意的问题就是在使用point对字符串进行定位的时候不要直接对point进行加减,这样会改变point的值,回溯过程中会收到很大影响
class Solution {
private:
// vector<vector<char>> letters = {
// {'a','b','c'},
// {'d','e','f'},
// {'g','h','i'},
// {'j','k','l'},
// {'m','n','o'},
// {'p','q','r','s'},
// {'t','u','v'},
// {'w','x','y','z'}
// };
unordered_map <char, string>letters = {
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
public:
//第一次尝试使用的方法
// vector<string> get(vector<string>input,int num)
// {
// vector<string> output;
// output.swap(input);
// int len = output.size();
// for(char & x: letters[num])
// {
// if(len == 0)
// {
// string ans;
// output.push_back(ans + x);
// }
// else
// {
// for(string & y : output)
// {
// string ans;
// ans = y + x;
// input.push_back(ans);
// }
// }
// }
// if(len == 0)
// return output;
// else
// return input;
// }
void get(int point, int dig, vector<string> &output,string digits,string ornal)
{
char part = digits[point];
string letter = letters.at(part);
for(char & x : letter)
{
string ans = ornal + x;
if(point == dig - 1)
{
output.push_back(ans);
}
else
{
get(point + 1, dig, output,digits, ans);
}
}
}
vector<string> letterCombinations(string digits) {
vector<string> output;
int digLen = digits.size();
if(digLen == 0)
return output;
string ornal;
get(0, digLen, output,digits,ornal);
return output;
};
};