当前位置: 首页 > news >正文

力扣 之 最小覆盖子串(变长滑动窗口,越短越好)

文章目录


76.最小覆盖子串
在这里插入图片描述

  • 思路分析
    • 一般思路:一开始看到这个题目,可能大家的第一个印象就是,就是需要不断枚举出s中所有的子串,然后再统计里面的各种字符的数量和种类,然后再与这个字符t作比较,但是这样的话,这个思路就十分宽泛,根本就是无从下手
    • 需要思考什么?
      • 枚举顺序:这个枚举的话,还是讲求一个顺序性,我们通过固定左端点,枚举右端点的思路,可以比价有效的进行一个枚举
      • 判断是否满足?: 对于是否满足,那么就是对于子串和字符串t来说,至少t中对应种类和数量的字符要满足
      • 更新方式:对于满足之后的更新主要是通过移动这个窗口的左端点来解决

思路1:通过两个向量,由于题目说了,存在大小写两种情况,那么就是我们可以开两个128长度的向量,分别统计两个字符串中字符的数量,那么这样的时候复杂度也就是O(128m+n)

class Solution {bool issame(vector<int> stores,vector<int> storet){for (int i = 'A';i <= 'Z';i++){if (stores[i] < storet[i]){return false;}}for (int i = 'a'; i <= 'z';i++){if (stores[i] < storet[i]){return false;}}return true;
}public:string minWindow(string s, string t) {vector<int> stores(128),storet(128);// 先存储字符串t的情况for (char c:t){storet[c]++;}int ansleft = -1,ansright = s.length(),left = 0;for (int right = 0; right < s.length();right++){stores[s[right]]++;while (issame(stores,storet)){if (right - left < ansright - ansleft){ansleft = left;ansright = right;}stores[s[left]]--;left++;}}return ansleft < 0 ? "" : s.substr(ansleft, ansright - ansleft + 1);}
};

思路2:(思路1的优化)

  • 使用变量less统计字符串t中不同种类的字符串的数量,并且定义这个向量store[i] = storet[i] - stores[i]
class Solution {
public:string minWindow(string s, string t) {vector<int> store(128);int less = 0;for (char c:t){if (store[c] == 0){less ++;}store[c] ++;}int m = s.size();int ansleft = -1,ansright = m,left = 0;// 定义的这个 cnt[i] 为字符 i 还需满足的数量for (int right = 0;right < m; right ++){store[s[right]] -- ;if (store[s[right]] == 0){// 刚好满足less --;}while (less == 0){//全部都满足if (right - left < ansright - ansleft){ansleft = left;ansright = right;}// 需要检查移动左端点对less的影响if (store[s[left]] == 0){less ++;}store[s[left]] ++;left++;}}return ansleft < 0 ? "" : s.substr(ansleft ,ansright - ansleft + 1);}
};
http://www.dtcms.com/a/303369.html

相关文章:

  • 推客系统全链路架构设计与高并发实践:从CPS分佣到社交裂变
  • ARM双频RFID读写系统的设计
  • 【快捷指令】ios/macos快捷指令如何调用api接口(json请求例子)
  • 从“数字鸿沟”到“数字红利”:智慧养老如何让老人跨越技术门槛
  • MBR和GPT分区的区别
  • C语言-数组:数组(定义、初始化、元素的访问、遍历)内存和内存地址、数组的查找算法和排序算法;
  • 导入Maven项目
  • 解决幻读问题
  • maven 打包报错 process terminated
  • 基于Spring Boot+Vue的吉他社团系统设计和实现(协同过滤算法)
  • 架构师增效指南:飞算JavaAI:需求驱动下的智能微服务拆分与治理
  • 五自由度磁悬浮轴承转子不平衡质量的高性能控制策略全解析
  • 亚马逊地址关联暴雷:新算法下的账号安全保卫战
  • 采用黑翅鸢优化算法BKA-CNN-LSTM、CNN-LSTM、LSTM、CNN四模型多变量回归预测,多输入单输出(Matlab)
  • 《计算机“十万个为什么”》之 [特殊字符] 序列化与反序列化:数据打包的奇妙之旅 ✈️
  • Python与Mysql
  • Error: Unable to find a match: python3.8
  • FDWS86068-F085高频开关电源DC/DC转换器,适合高功率密度N沟道增强型
  • 7月28号打卡
  • 为什么额前的头发叫刘海,不叫张海
  • Linux 下安装包安装lsof工具
  • 基础算法(9)——哈希表
  • nginx日志分割
  • 11.Dockerfile简介
  • Java中的协变、逆变
  • 【AI绘画】Stable Diffusion webUI 与 ComfyUI 全解析:安装、模型、插件及功能对比
  • 使用宝塔“PostgreSQL管理器”安装的PostgreSQL,如何设置远程连接?
  • 开发避坑短篇(7):Vue+window.print()打印实践
  • Linux中配置haproxy
  • Java 笔记 serialVersionUID