【力扣】電話號碼的組合(回溯法)

SaTsuki26681534發表於2024-03-07

問題描述

image

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的呼叫是向下一層遞迴。

相關文章