電話號碼的字母序列

Chunleiii發表於2024-11-29

題目描述

輸入一個僅包含數字 2-9 的字串,輸出所有它能表示的字母序列。
給出數字到字母的對映如下(與電話按鍵相同)。注意 1 不對應任何字母。
0

輸入

輸入一個包含數字 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;

}

相關文章