leetcode(76-80)

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 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 ... 中所有可能的 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)

你可能感兴趣的:(leetcode,C++,leetcode)