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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

題目

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

思考與遞歸程序

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

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

確定終止條件
當index等于數字個數時收集結果,返回。

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

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

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;} };

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

語法細節

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。