76. 最小覆盖子串
给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC"说明:
如果 S 中不存这样的子串,则返回空字符串 ""。如果 S 中存在这样的子串,我们保证它是唯一的答案。 class Solution { public: string minWindow(string s, string t) { if(t.size() > s.size()) return ""; string res = ""; int left=0, count=0, minLen=s.size()+1; unordered_map<char,int> m; for(int i=0; i<t.size(); i++){ if(m.find(t[i]) != m.end()) m[t[i]]++; else m[t[i]] = 1; } for(int right=0; right<s.size(); right++){ if(m.find(s[right]) != m.end()){ --m[s[right]]; if(m[s[right]] >= 0) count++; while(count == t.size()){ if(right-left+1 < minLen){ minLen = right-left+1; res = s.substr(left, minLen); } if(m.find(s[left]) != m.end()){ m[s[left]]++; if(m[s[left]] > 0) count--; } left++; } } } return res; } };77.组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; if(n<k) return res; vector<int> nums; comb(n,k,1,nums,res); return res; } void comb(int n, int k, int start, vector<int> nums, vector<vector<int>>& res){ if(k == nums.size()){ res.push_back(nums); return; } for(int i=start; i <= n-(k-nums.size())+1; i++){ nums.push_back(i); comb(n,k,i+1,nums,res); nums.pop_back(); } } };78. 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; sort(nums.begin(), nums.end()); int n = nums.size(); vector<int> tmp; for(int i=0; i<pow(2,n); i++){ for(int j=0; j<n; j++){ if(i & 1 << j) tmp.push_back(nums[j]); } res.push_back(tmp); tmp.clear(); } return res; } };79. 单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例:
board = [ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E'] ] 给定 word = "ABCCED", 返回 true. 给定 word = "SEE", 返回 true. 给定 word = "ABCB", 返回 false. class Solution { public: bool exist(vector<vector<char>>& board, string word) { if(board.empty()) return false; int row = board.size(); int col = board[0].size(); vector<vector<bool>> visited(row, vector<bool>(col,false)); for(int i=0; i<row; i++){ for(int j=0; j<col; j++){ if(dfs(board, word, 0, i, j, visited)) return true; } } return false; } bool dfs(vector<vector<char>> &board, string &word,int index, int i, int j, vector<vector<bool>> &visited){ if(index == word.size()) return true; if(i<0 || j<0 || i>=board.size() || j>=board[0].size()) return false; if(visited[i][j]) return false; if(word[index] != board[i][j]) return false; visited[i][j] = true; bool res = dfs(board, word, index+1, i-1, j, visited) || dfs(board, word, index+1, i+1, j, visited) || dfs(board, word, index+1, i, j-1, visited) || dfs(board, word, index+1, i, j+1, visited); visited[i][j] = false; return res; } };80. 删除排序数组中的重复项 II
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定 nums = [1,1,1,2,2,3], 函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2,3。 你不需要考虑数组中超出新长度后面的元素。示例 2:
给定 nums = [0,0,1,1,1,1,2,3,3], 函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 你不需要考虑数组中超出新长度后面的元素。 class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.size() == 0) return 0; else if(nums.size() == 1) return 1; int pos = 0; int flag = 0; for(int i=1; i<nums.size(); i++){ if(nums[i] != nums[pos]) { nums[++pos] = nums[i]; flag = 0; } else if(nums[i] == nums[pos] && !flag){ nums[++pos] = nums[i]; flag = 1; } else { } } return ++pos; } };(以上题目均摘自leetcode)