76. 最小覆盖子串
给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
""
。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 m;
for(int i=0; i= 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> combine(int n, int k) {
vector> res;
if(n nums;
comb(n,k,1,nums,res);
return res;
}
void comb(int n, int k, int start, vector nums, vector>& 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> subsets(vector& nums) {
vector> res;
sort(nums.begin(), nums.end());
int n = nums.size();
vector tmp;
for(int i=0; i
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>& board, string word) {
if(board.empty()) return false;
int row = board.size();
int col = board[0].size();
vector> visited(row, vector(col,false));
for(int i=0; i> &board, string &word,int index, int i, int j, vector> &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& 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
(以上题目均摘自leetcode)