日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 17. 电话号码的字母组合 思考分析

發(fā)布時間:2023/12/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 17. 电话号码的字母组合 思考分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

給定一個僅包含數(shù)字 2-9 的字符串,返回所有它能表示的字母組合。
給出數(shù)字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。

思考與遞歸程序

解空間樹的寬度是輸入數(shù)字對應的字符的個數(shù),深度是輸入的數(shù)字的個數(shù)。
確定回溯函數(shù)參數(shù)
與之前l(fā)eetcode 216. 組合總和 III 思考分析一樣,我們需要建立兩個全局變量,一個存放葉子結(jié)點子結(jié)果,一個用來存放所有子結(jié)果。
參數(shù):第一個是string digits(數(shù)字字符串),一個是int index.
用index記錄遍歷第幾個數(shù)字了。

vector<string> result; string res; void backtracking(const string& digits,int index)

確定終止條件
當index等于數(shù)字個數(shù)時收集結(jié)果,返回。

if(index == digits.size()) {result.push_back(s);return; }

單層邏輯
取第index個數(shù)字,并且找到對應的字符集。然后for循環(huán)這個字符集(for循環(huán)處理的是當層的樹寬度有關(guān)數(shù)據(jù))
同時注意原來的字符類型的數(shù)字,要進行轉(zhuǎn)換。

int digit = digits[index]-'0'; string letters = letterMap[digit]; //取出對應的字符集 for(int i=0;i<letters.size();i++) {res.push_back(letters[i]);backtracking(digits,index+1);res.pop_back(); //回溯 }

異常輸入情況輸入處理
如果輸入1、*、#等字符時,我們應該返回并且打印出錯誤信息

//判斷是否有非法字符 if(digits[index]=='0' || digits[index]=='1'|| digits[index]=='*'|| isValid == false) {isValid=false;result.clear();//res.clear(); 如果這里clear的話,返回到上一層的時候,會有個回溯操作res.pop,會導致報錯return; }

完整代碼:

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]; //取出對應的字符集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;} };

對錯誤案例的測試:
很顯然,力扣的測試程序中并沒有考慮異常輸入

語法細節(jié)

1、函數(shù)傳參中
直接用string s相當于是拷貝了一份,而用&不用拷貝內(nèi)存。
2、在函數(shù)中如果用不帶const的引用會報錯:
臨時變量不能作為非const的引用參數(shù),換句話說就是要引用臨時變量必須帶上const,這是c++的語法規(guī)范。
函數(shù)參數(shù)作為引用,函數(shù)就有責任把函數(shù)內(nèi)存操作此參數(shù)的結(jié)果給出來。但是這個是一個臨時變量,隨時可能釋放掉。所以為了避免這個現(xiàn)象,就加上一個規(guī)則,不帶const的臨時變量不讓通過。

總結(jié)

以上是生活随笔為你收集整理的leetcode 17. 电话号码的字母组合 思考分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。