《慕课网玩转算法面试》笔记及习题解答8.1~8.3
来源:互联网 发布:上古世纪捏脸数据大全 编辑:程序博客网 时间:2024/06/04 19:19
LeetCode 17. 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"].思路:采用回溯法,当当前是string长度等于digits长度时,则找到了一个满足条件的string
class Solution {private: const string record[10] = {" ","" ,"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; void findCombinations(const string& digits, const int& index, string s, vector<string>& res){ //找到了一个满足条件的s if( index == digits.length() ){ res.push_back(s); return; } char c = digits[index]; string letters = record[c - '0']; for(int i = 0; i < letters.length(); i++){ findCombinations( digits, index + 1, s + letters[i] , res ); } return; }public: vector<string> letterCombinations(string digits) { vector<string> res; if(digits =="") return res; findCombinations(digits, 0, "", res); return res; }};
LeetCode 93
有点难,暂时不会做。。
LeetCode 131
思路:使用回溯法,对于每个能构成回文的字串放入数组,后半部分递归,递归结束后进行回溯
class Solution {private: bool isPalindrome(string s) { int i = 0, j = s.length()-1; while(i < j){ if(s[i]!=s[j]) return false; i++; j--; } return true; } void findPartition(const string& s, const int& start , vector<string>& p, vector<vector<string>>& res){ if(start == s.length()){ res.push_back(p); return; } for(int i = start+1; i <= s.length(); i++){ //如果s[start,i)是回文,将s[start,i)放入数组中,后半部分递归 if( isPalindrome(s.substr(start,i-start)) ){ p.push_back(s.substr(start,i-start)); findPartition(s, i, p, res); //注意递归结束后要进行回溯操作 p.pop_back(); } } return; }public: vector<vector<string>> partition(string s) { vector<vector<string>> res; if(s.empty()) return res; vector<string> p; findPartition(s, 0, p,res); return res; }};
LeetCode 46
Given a collection of distinct numbers, return all possible permutations.
For example,[1,2,3]
have the following permutations:
[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
思路:回溯法寻找,设置一个bool数组来判断是否包含,注意终止条件,递归结束后需要将bool数组修改来保证回溯
class Solution {private: vector<bool> isUsed; void findPermute(const vector<int>& nums, int index, vector<int>& num, vector<vector<int>>& res) { //找到一个满足条件的数组的终止条件 if(num.size() == nums.size()) { res.push_back(num); return; } for(int i = 0; i< nums.size(); i++){ if(!isUsed[i]){ num.push_back(nums[i]); isUsed[i] = true; findPermute(nums, index+1, num, res); //注意,递归结束时是已经找到了一个包含nums[index]的数组,要重新寻找新数组,此时要将nums[i] pop并且将isUesd[i]设置成false num.pop_back(); isUsed[i] = false; } } return; }public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; if(nums.empty()) return res; isUsed = vector<bool>(nums.size(),false); vector<int> num; findPermute(nums, 0, num, res); return res; }};
阅读全文
0 0
- 《慕课网玩转算法面试》笔记及习题解答8.1~8.3
- 《慕课网玩转算法面试》笔记及习题解答1
- 《慕课网玩转算法面试》笔记及习题解答2
- 《慕课网玩转算法面试》笔记及习题解答3.5~3.6
- 《慕课网玩转算法面试》笔记及习题解答3.1 ~3.4
- 《慕课网玩转算法面试》笔记及习题解答3.7 ~3.8
- 《慕课网玩转算法面试》笔记及习题解答4
- 《慕课网玩转算法面试》笔记及习题解答5.1.~5.3
- 《慕课网玩转算法面试》笔记及习题解答5.4.~5.6
- 《慕课网玩转算法面试》笔记及习题解答6.4.~6.6
- 《慕课网玩转算法面试》笔记及习题解答6.7
- 《慕课网玩转算法面试》笔记及习题解答7.1~7.3
- 《慕课网玩转算法面试》笔记及习题解答7.4~7.6
- 《慕课网玩转算法面试》笔记及习题解答8.4~8.5
- 《慕课网玩转算法面试》笔记及习题解答9.3
- 《慕课网玩转算法面试》笔记及习题解答9.4
- 《慕课网玩转算法面试》笔记及习题解答9.8
- Android面试习题及个人解答
- spring学习笔记十四 五种通知
- JAVA开发常用设计模式介绍、设计模式案例
- Java变量的输入 Scanner类
- Mysql导入与导出
- bzoj1878 [SDOI2009]HH的项链
- 《慕课网玩转算法面试》笔记及习题解答8.1~8.3
- laravel中用到的函数和语法
- PHP设计模式之单例模式
- bzoj2330 [SCOI2011]糖果
- Leetcode c语言-Integer to Roman
- bzoj2563 阿狸和桃子的游戏
- PAT 1023. Have Fun with Numbers (20) 模拟大数乘法
- session自动更新 购物车条目 原因:本质是,对 内存和磁盘的区别,以及session是个内存中的map,不清楚
- Elasticsearch-rtf/head/npm/cnpm