問題描述
class Solution {
public:
vector<string> res;
string path;
// char A[26] = {'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'};
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
//首先,數字字元和字母字元相對應的問題很難解決,所以需要定義一個char的二維陣列來儲存數字與字母的對映
//另外,還需要把所給的字串作為引數傳入backtrace函式中,否則很難確定下一層遞迴的迴圈起點
void backtrace(const string& digits, int pos){
//這裡的pos應該是字串digits的下標
//在lettermap裡的下標應該是
if(path.size() == digits.size()){
res.push_back(path);
return ;
}
int MapPos = digits[pos] - '0';
for(int i = 0; i < letterMap[MapPos].size(); i++ ){
path+=letterMap[MapPos][i];
backtrace(digits, pos+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
res.clear();
path.clear();
if(digits.size() == 0){
return res;
}
backtrace(digits, 0);
return res;
}
};
按照回溯的三個部分依次構建,注意區分在哪裡是向下一層遞迴,在哪裡是探索同層的下一個。
在backtrace函式中,for迴圈是為了窮盡一層內的所有可能,所以i的右邊界應該是電話按鍵上某個數字對應的字母個數,而迴圈體裡對backtrace的呼叫是向下一層遞迴。