用栈的思想。
第一种方法,设置两个string栈,每次从栈A取出string,加上一个char后放入栈B(注意放入栈B的是多个string,因为加char有超过一种加法例如数字1对应可以加'a'或'b'或'c'),直到栈A为空。栈A为空后把栈A和栈B swap一下。这样下一次循环还是从栈A去,往栈B放。
共循环n次,n是phone number的长度。
代码如下:
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> stack1, stack2;
int max = digits.size();
stack1.push_back(string(""));
for(int i=0; i<max; i++) {
while(!stack1.empty()) {
string top = stack1.back();
stack1.pop_back();
char digit = digits[i];
switch (digit) {
case '2':
stack2.push_back(top + 'a');
stack2.push_back(top + 'b');
stack2.push_back(top + 'c');
break;
case '3':
stack2.push_back(top + 'd');
stack2.push_back(top + 'e');
stack2.push_back(top + 'f');
break;
case '4':
stack2.push_back(top + 'g');
stack2.push_back(top + 'h');
stack2.push_back(top + 'i');
break;
case '5':
stack2.push_back(top + 'j');
stack2.push_back(top + 'k');
stack2.push_back(top + 'l');
break;
case '6':
stack2.push_back(top + 'm');
stack2.push_back(top + 'n');
stack2.push_back(top + 'o');
break;
case '7':
stack2.push_back(top + 'p');
stack2.push_back(top + 'q');
stack2.push_back(top + 'r');
stack2.push_back(top + 's');
break;
case '8':
stack2.push_back(top + 't');
stack2.push_back(top + 'u');
stack2.push_back(top + 'v');
break;
case '9':
stack2.push_back(top + 'w');
stack2.push_back(top + 'x');
stack2.push_back(top + 'y');
stack2.push_back(top + 'z');
break;
}
}
swap(stack1, stack2);
}
return stack1;
}
};
第二种方法只用一个栈,即从这个栈取也往这个栈里放,取出来以后看这个string的长度,决定往里添加哪个digit对应的letter。例如输入数字是9893654,取出来一个string是sah,即长度为3,说明需要添加第4个digit对应的letter,即9893654中的3对应的letter。
但是要对输入的phone number进行一些处理——先在phone number里去掉0和1,因为这两个数没有对应任何字母。
代码如下:
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
vector<string> stack;
string::iterator pend = remove(digits.begin(), digits.end(), '0');
pend = remove(digits.begin(), pend, '1'); // 输入的digits中去除0和1
int max = pend - digits.begin();
stack.push_back(string(""));
while(!stack.empty()) {
string top = stack.back();
stack.pop_back();
int len = top.size();
if(len == max) {
res.push_back(top);
continue;
}
char digit = digits[len];
switch (digit) {
case '2':
stack.push_back(top + 'a');
stack.push_back(top + 'b');
stack.push_back(top + 'c');
break;
case '3':
stack.push_back(top + 'd');
stack.push_back(top + 'e');
stack.push_back(top + 'f');
break;
case '4':
stack.push_back(top + 'g');
stack.push_back(top + 'h');
stack.push_back(top + 'i');
break;
case '5':
stack.push_back(top + 'j');
stack.push_back(top + 'k');
stack.push_back(top + 'l');
break;
case '6':
stack.push_back(top + 'm');
stack.push_back(top + 'n');
stack.push_back(top + 'o');
break;
case '7':
stack.push_back(top + 'p');
stack.push_back(top + 'q');
stack.push_back(top + 'r');
stack.push_back(top + 's');
break;
case '8':
stack.push_back(top + 't');
stack.push_back(top + 'u');
stack.push_back(top + 'v');
break;
case '9':
stack.push_back(top + 'w');
stack.push_back(top + 'x');
stack.push_back(top + 'y');
stack.push_back(top + 'z');
break;
}
}
return res;
}
};