leetcode 17. 电话号码的字母组合 思考分析
題目
給定一個僅包含數(shù)字 2-9 的字符串,返回所有它能表示的字母組合。
給出數(shù)字到字母的映射如下(與電話按鍵相同)。注意 1 不對應(yīng)任何字母。
思考與遞歸程序
解空間樹的寬度是輸入數(shù)字對應(yīng)的字符的個數(shù),深度是輸入的數(shù)字的個數(shù)。
確定回溯函數(shù)參數(shù)
與之前l(fā)eetcode 216. 組合總和 III 思考分析一樣,我們需要建立兩個全局變量,一個存放葉子結(jié)點(diǎn)子結(jié)果,一個用來存放所有子結(jié)果。
參數(shù):第一個是string digits(數(shù)字字符串),一個是int index.
用index記錄遍歷第幾個數(shù)字了。
確定終止條件
當(dāng)index等于數(shù)字個數(shù)時收集結(jié)果,返回。
單層邏輯
取第index個數(shù)字,并且找到對應(yīng)的字符集。然后for循環(huán)這個字符集(for循環(huán)處理的是當(dāng)層的樹寬度有關(guān)數(shù)據(jù))
同時注意原來的字符類型的數(shù)字,要進(jìn)行轉(zhuǎn)換。
異常輸入情況輸入處理
如果輸入1、*、#等字符時,我們應(yīng)該返回并且打印出錯誤信息
完整代碼:
class Solution { public:const string letterMap[10]={"", //0"", //1"abc", //2"def", //3"ghi", //4"jkl", //5"mno", //6"pqrs", //7"tuv", //8"wxyz", //9};vector<string> result;string res;bool isValid =true;void backtracking(const string& digits,int index){if(index == digits.size()){result.push_back(res);return;}//判斷是否有非法字符if(digits[index]=='0' || digits[index]=='1'|| digits[index]=='*'|| isValid == false){isValid=false;result.clear();//res.clear();return;}int digit = digits[index]-'0';string letters = letterMap[digit]; //取出對應(yīng)的字符集for(int i=0;i<letters.size();i++){res.push_back(letters[i]);backtracking(digits,index+1);res.pop_back(); //回溯}}vector<string> letterCombinations(string digits) {result.clear();res.clear();isValid = true;if(digits.size() == 0) return result;backtracking(digits,0);if(isValid == false) cout<<"輸入的字符中有異常"<<endl;return result;} };對錯誤案例的測試:
很顯然,力扣的測試程序中并沒有考慮異常輸入
語法細(xì)節(jié)
1、函數(shù)傳參中
直接用string s相當(dāng)于是拷貝了一份,而用&不用拷貝內(nèi)存。
2、在函數(shù)中如果用不帶const的引用會報錯:
臨時變量不能作為非const的引用參數(shù),換句話說就是要引用臨時變量必須帶上const,這是c++的語法規(guī)范。
函數(shù)參數(shù)作為引用,函數(shù)就有責(zé)任把函數(shù)內(nèi)存操作此參數(shù)的結(jié)果給出來。但是這個是一個臨時變量,隨時可能釋放掉。所以為了避免這個現(xiàn)象,就加上一個規(guī)則,不帶const的臨時變量不讓通過。
總結(jié)
以上是生活随笔為你收集整理的leetcode 17. 电话号码的字母组合 思考分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开封治疗女性卵巢多囊最好的医院推荐
- 下一篇: DNF什么职业好刷图