最初拿到这个题的时候我想的是通过循环来解决,如果通过循环的话,会有很多的问题,或者可以通过循环来模拟回溯法也是可以实现的。先说一下我的思想,最初我想的是,在开辟好的空间里直接放入数据,比如题目中给出的示例是23,我在放的时候,先把2中的a放三个,再把2中的b放三个,再把c放三个,但是这样就出现了问题,那到3的时候怎么放,如果和上边一样的话就会出现ad ad ad be be be cf cf cf这种情况,因为这是一个循环来解决的,所以存放的方式不能够区别对待,也就是前一个怎么放后一个还是怎么放,所以就出现了我上边的问题。
这种问题无非就是两种方式循环解决不掉了,那就用递归
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> str;
if (digits.size() == 0)
{
return str;
}
string s;
Combinations(digits, s, 0, str);
return str;
}
private:
void Combinations(string& digits, string& s, int index, vector<string>& str)
{
if (index == digits.size())
{
str.push_back(s);
return;
}
int num = digits[index] - '0';
string letter[10] = { " ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
for (int i = 0; i < letter[num].size(); i++)
{
s.push_back(letter[num][i]);
Combinations(digits, s, index + 1, str);
s.pop_back();
}
return;
}
};