題目描述
輸入一個僅包含數字 2-9 的字串,輸出所有它能表示的字母序列。
給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。
輸入
輸入一個包含數字 2-9 的字串,長度不超過6。
輸出
按字典序輸出所有能表示的字母序列,每行輸出一個。
輸入樣例
23
輸出樣例
ad
ae
af
bd
be
bf
cd
ce
cf
解題思路
1.組合問題想回溯
2.一個回溯函式,一個返回結果的函式
題解
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class Solution{
//首先儲存數字與字母之間的對映
//使用private保護資料
private:
//使用二維陣列
const string num_letter[10]={
"",//0
"",//1
"abc",//2
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
//介面函式,public
public:
//記錄臨時結果
string s;
//記錄最終結果,要注意results包含多個字元組合,所以是用vector型別
vector<string> result;
//先定義回溯函式,其實就是遞迴函式啦~
void backtracking(const string& digits,int index){
//終止條件
if(index==digits.size()){
//最終結果
result.push_back(s);
return;
}
int digit=digits[index]-'0';//這一部非常重要,是把index指向的數字字串轉成了int型別
string letters=num_letter[digit];//取相應字串
for(int i=0;i<letters.size();i++){
s.push_back(letters[i]);
backtracking(digits,index+1);
s.pop_back();
}
}
//使用回溯函式,返回最終結果
vector<string> conbination(const string& digits){
s.clear();
result.clear();
if(digits.size()==0){
return result;
}
backtracking(digits,0);
return result;
}
};
int main(){
Solution solution;
string digits;
cin >> digits; // 從標準輸入讀取數字字串
vector<string> result = solution.conbination(digits);
// 按行輸出每一個字母組合
for (const string& combination : result) {
cout << combination << endl;
}
return 0;
}