1. 程式人生 > >Letter Combinations of a Phone Number——解題報告 (回溯法的應用 )

Letter Combinations of a Phone Number——解題報告 (回溯法的應用 )

    【題目】

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

    【分析】

     如果我們使用for迴圈來遍歷的話,也是可以求解的。但是,這道題目在參考了人家的解法之後,覺得使用基於回溯法的遞迴方式更加巧妙。

    注意:遞迴思路在程式設計的時候,一定要先寫跳出遞迴的條件if語句,然後再寫其餘的部分。而且,回溯法的思想是遍歷完一次之後,退一步,繼續遍歷,這個繼續遍歷的過程有時呼叫一次函式的過程,所以是遞迴方式。

    【程式碼】

    注意:vector的初始化;還有string型別作為一個容器,也是有push_back和pop_back函式的;回溯法的核心程式碼local.pop_back()。

    執行時間:2ms

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> res;
        if(digits.size() == 0)
            return res;
            
        vector<string> phone(2, "");
        phone.push_back("abc");
        phone.push_back("def");
        phone.push_back("ghi");
        phone.push_back("jkl");
        phone.push_back("mno");
        phone.push_back("pqrs");
        phone.push_back("tuv");
        phone.push_back("wxyz");
        
        string local;
        backTracking(res, phone, digits, 0, local);
        
        return res;
    }
    
    void backTracking(vector<string>& res, vector<string>& phone, string& digits, int index, string& local)
    {
        if(index == digits.length())  // 作為每次遍歷結束的出口
        {
            res.push_back(local);
            return;
        }
            
        for(int i = 0; i < phone[digits[index] - '0'].length(); i++)  // 遍歷每個按鍵包含的串長
        {
            local += phone[digits[index] - '0'][i];  // 連線當前字元
            backTracking(res, phone, digits, index + 1, local);  // 遍歷當前字元後面的情況
            local.pop_back();  // 回溯法的關鍵:遍歷好一次之後,退一步,繼續遍歷
        }
        // 全是引用型別,無返回值,簡潔
    }
};