鱼C论坛

 找回密码
 立即注册
查看: 2338|回复: 1

[技术交流] C++刷leetcode(76. 最小覆盖子串)【滑动窗口】

[复制链接]
发表于 2020-7-12 12:15:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目描述:
  1. 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

  2. 示例:

  3. 输入: S = "ADOBECODEBANC", T = "ABC"
  4. 输出: "BANC"
  5. 说明:

  6. 如果 S 中不存这样的子串,则返回空字符串 ""。
  7. 如果 S 中存在这样的子串,我们保证它是唯一的答案。

  8. 来源:力扣(LeetCode)
  9. 链接:https://leetcode-cn.com/problems/minimum-window-substring
  10. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

  1. class Solution {
  2. public:
  3.     string minWindow(string s, string t) {
  4.         map<char, int> need, store;
  5.         for(auto cha : t)need[cha]++;

  6.         int left = 0, right = 0;
  7.         int start = 0, valid = 0;
  8.         int len = INT_MAX;
  9.         while(right < s.size()){
  10.             char temp = s[right];
  11.             right++;

  12.             if(need.count(temp) != 0){
  13.                 store[temp]++;
  14.                 if(store[temp] == need[temp])valid++;
  15.             }

  16.             while(valid == need.size()){//注意此处的判断
  17.                 if(right - left < len){
  18.                     len = right - left;
  19.                     start = left;
  20.                 }
  21.                 char temp1 = s[left];
  22.                 left++;
  23.                 if(need.count(temp1)!=0){
  24.                     if(need[temp1] == store[temp1])valid--;
  25.                     store[temp1]--;
  26.                 }
  27.             }
  28.         }
  29.         return len == INT_MAX ? "" : s.substr(start, len);
  30.     }
  31. };
复制代码



参考链接:https://leetcode-cn.com/problems ... -yong-si-xiang-by-/

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-16 13:43:14 | 显示全部楼层
相似题目:面试题 17.18. 最短超串
题目描述:
  1. 假设你有两个数组,一个长一个短,短的元素均不相同。找到长数组中包含短数组所有的元素的最短子数组,其出现顺序无关紧要。

  2. 返回最短子数组的左端点和右端点,如有多个满足条件的子数组,返回左端点最小的一个。若不存在,返回空数组。

  3. 示例 1:

  4. 输入:
  5. big = [7,5,9,0,2,1,3,5,7,9,1,1,5,8,8,9,7]
  6. small = [1,5,9]
  7. 输出: [7,10]
  8. 示例 2:

  9. 输入:
  10. big = [1,2,3]
  11. small = [4]
  12. 输出: []
  13. 提示:

  14. big.length&#160;<= 100000
  15. 1 <= small.length&#160;<= 100000

  16. 来源:力扣(LeetCode)
  17. 链接:https://leetcode-cn.com/problems/shortest-supersequence-lcci
  18. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码


  1. class Solution {
  2. public:
  3.     vector<int> shortestSeq(vector<int>& big, vector<int>& small) {
  4.         map<int, int> need, store;
  5.         for(auto cha : small)need[cha]++;

  6.         int left = 0, right = 0;
  7.         int start = 0, valid = 0;
  8.         int len = INT_MAX;
  9.         //先固定右端再逐渐缩短左端
  10.         while(right < big.size()){
  11.             int temp = big[right];
  12.             right++;
  13.             if(need.count(temp) != 0){
  14.                 store[temp]++;
  15.                 if(store[temp] == need[temp])valid++;
  16.             }

  17.             while(valid == need.size()){
  18.                 if(right - left < len){
  19.                     len = right - left;
  20.                     start = left;
  21.                 }

  22.                 int temp1 = big[left];
  23.                 left++;
  24.                 if(need.count(temp1)!=0){
  25.                     if(need[temp1] == store[temp1])valid--;
  26.                     store[temp1]--;
  27.                 }
  28.             }
  29.         }
  30.         vector<int>res;
  31.         if(len != INT_MAX)res = {start, start + len - 1};
  32.         return res;
  33.     }
  34. };
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-13 05:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表