leetcode 567. 字符串的排列(滑动窗口-java)
滑动窗口
- 字符串的排列
- 滑动窗口
- 代码演示
- 进阶优化版
- 上期经典
字符串的排列
难度 -中等
leetcode567. 字符串的排列
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入:s1= “ab” s2 = “eidboaoo”
输出:false
提示:
1 <= s1.length, s2.length <= 1e4
s1 和 s2 仅包含小写字母
滑动窗口
这种题目,是明显的滑动窗口算法,相当给你一个 S 和一个 T,请问你 S 中是否存在一个子串,包含 T 中所有字符且不包含其他字符。
题目要求 t 的排列之一是 s 的一个子串。而子串必须是连续的,所以要求的 s 子串的长度跟 t 长度必须相等。
那么我们有必要把 t 的每个排列都求出来吗?当然不用。如果字符串 a 是 b 的一个排列,那么当且仅当它们两者中的每个字符的个数都必须完全相等。
所以,根据上面两点分析,我们已经能确定这个题目可以使用 滑动窗口 + hash表 来解决。
我们使用一个长度和 t 长度相等的固定窗口大小的滑动窗口,在 s 上面从左向右滑动,判断 s 在滑动窗口内的每个字符出现的个数是否跟 t 每个字符出现次数完全相等。
我们定义 need是对 t 内字符出现的个数的统计,定义 wind是对 s 内字符出现的个数的统计。在窗口每次右移的时候,需要把右边新加入窗口的字符个数在 wind 中加 1,把左边移出窗口的字符的个数减 1。如果 need== wind,那么说明窗口内的子串是 t 的一个排列,返回 True;如果窗口已经把 s遍历完了仍然没有找到满足条件的排列,返回 False。
代码演示
public boolean checkInclusion(String t, String s) {int n = t.length(), m = s.length();if (n > m) {return false;}HashMap<Character, Integer> need = new HashMap<>();HashMap<Character, Integer> wind = new HashMap<>();for (char c : t.toCharArray()){need.put(c,need.getOrDefault(c,0) + 1);}int left = 0;int right = 0;int valid = 0;while (right < m){//右指针 向右移动 窗口扩大char c = s.charAt(right);right++;//判断新进来的字符 是否是需要的。if (need.containsKey(c)){wind.put(c,wind.getOrDefault(c,0) + 1);if (wind.get(c).equals(need.get(c))){valid++;}}//判断是否需要缩小窗口。while (right - left >= n){//找到直接返回trueif (valid == need.size()){return true;}//如何缩小窗口char d = s.charAt(left);left++;if (need.containsKey(d)){if (need.get(d).equals(wind.get(d))){valid--;}wind.put(d,wind.get(d) - 1);}}}return false;}
进阶优化版
这道题目中说明只有小写字母,因此我们可以用数组代替hash表,进行优化,数组代替hash表有两个好处,
1.优化了常数时间,数组的时间效率高于hash表,
2.优化了内存,数组更省空间,
代码演示:
public boolean checkInclusion(String t, String s) {int n = t.length(), m = s.length();if (n > m) {return false;}int[] need = new int[26];int[] wind = new int[26];for (char c : t.toCharArray()){++need[c - 'a'];}int left = 0;int right = 0;while (right < m){//右指针 向右移动 窗口扩大char c = s.charAt(right);right++;//判断新进来的字符 是否是需要的。if (need[c - 'a'] != 0){++wind[c - 'a'];}//判断是否需要缩小窗口。while (right - left >= n){//找到直接返回trueif (Arrays.equals(wind,need)){return true;}//如何缩小窗口char d = s.charAt(left);left++;if (need[d - 'a'] != 0){--wind[d - 'a'];}}}return false;}
上期经典
leetcode76. 最小覆盖子串
相关文章:
leetcode 567. 字符串的排列(滑动窗口-java)
滑动窗口 字符串的排列滑动窗口代码演示进阶优化版 上期经典 字符串的排列 难度 -中等 leetcode567. 字符串的排列 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。 换句…...
Git —— 分支重命名操作
在开发中,对某个分支进行重命名的操作: 1、本地分支重命名 本地分支是指:你当前这个分支还没有推送到远程的情况,这种情况修改分支名称就要方便很多 git branch -m 原始名称 新名称 //示例: 修改 test 为 newTest g…...
JavaIO流
JavaIO流 一、概念二、File类三、File类的使用1、File文件/文件夹类的创建2、File类的获取操作3、File类判断操作 - boolean4、File类对文件/文件夹的增删改5、File类的获取子文件夹以及子文件的方法 四、Java中IO流多种维度的维度1、按照流向 - Java程序2、按照流的大小分类3、…...
FlinkSql 如何实现数据去重?
摘要 很多时候flink消费上游kafka的数据是有重复的,因此有时候我们想数据在落盘之前进行去重,这在实际开发中具有广泛的应用场景,此处不说详细代码,只粘贴相应的flinksql 代码 --********************************************…...
机器学习概念
目录 一、人工智能、机器学习、深度学习的关系 二、什么是深度学习? 2.1 深度学习常用算法 一、人工智能、机器学习、深度学习的关系 人工智能、机器学习和深度学习的关系如下所示。 二、什么是深度学习? 深度学习( DL, Deep Learning) 是机器学习 …...
【数据结构】排序(插入、选择、交换、归并) -- 详解
一、排序的概念及其运用 1、排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记…...
游戏中的图片打包流程,免费的png打包plist工具,一款把若干资源图片拼接为一张大图的免费工具
手机游戏开发中,为了提高图片渲染性能,经常需要将小图片合并成一张大图进行渲染。如果手工来做的话就非常耗时。TexturePacker就是一款非常不错方便的处理工具。TexturePacker虽然非常优秀,但不是免费的。 对于打包流程,做游戏的…...
Springboot实现ENC加密
Springboot实现ENC加密 1、导入依赖2、配置加密秘钥(盐)3、获取并配置密文4、重启项目测试5、自定义前缀、后缀6、自定义加密方式 1、导入依赖 关于版本,需要根据spring-boot版本,自行修改 <dependency><groupId>co…...
nginx 托管vue项目配置
server {listen 80;server_name your_domain.com;location / {root /path/to/your/vue/project;index index.html;try_files $uri $uri/ /index.html;} }奇怪的现象,在vue路由中/会跳转到/abc/def,但如果直接输入/abc/def会显示404,添加 try_files $uri…...
Vue3中如何进行封装?—组件之间的传值
用了很久一段时间Vue3Ts了,工作中对一些常用的组件也进行了一些封装,这里对封装的一些方法进行一些简单的总结。 1.props传递 首先在主组件进行定义传值 <template><div>这里是主组件<common :first"first"></common&…...
实训笔记8.25
实训笔记8.25 8.25笔记一、Flume数据采集技术1.1 Flume实现数据采集主要借助Flume的组成架构1.2 Flume采集数据的时候,核心是编写Flume的采集脚本xxx.conf1.2.1 脚本文件主要由五部分组成 二、Flume案例实操2.1 采集一个网络端口的数据到控制台2.1.1 分析案例的组件…...
vue自定义监听元素宽高指令
在 main.js 中添加 // 自定义监听元素高度变化指令 const resizerMap new WeakMap() const resizeObserver new ResizeObserver((entries) > {for (const entry of entries) {const handle resizerMap.get(entry.target)if (handle) {handle({width: entry.borderBoxSiz…...
网络爬虫到底是个啥?
网络爬虫到底是个啥? 当涉及到网络爬虫技术时,需要考虑多个方面,从网页获取到最终的数据处理和分析,每个阶段都有不同的算法和策略。以下是这些方面的详细解释: 网页获取(Web Crawling)&#x…...
前端行级元素和块级元素的基本区别
块级元素和行内元素的基本区别是, 行内元素可以与其他行内元素并排;块级元素独占一行,不能与其他任何元素并列; 下面看一下; <!DOCTYPE html> <html> <head> <meta charset"utf-8"&…...
CentOS 7用二进制安装MySQL5.7
[rootlocalhost ~]# [rootlocalhost ~]# ll 总用量 662116 -rw-------. 1 root root 1401 8月 29 19:29 anaconda-ks.cfg -rw-r--r--. 1 root root 678001736 8月 29 19:44 mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz [rootlocalhost ~]# tar xf mysql-5.7.40-linux-…...
华为加速回归Mate 60发布, 7nm全自研工艺芯片
华为于今天12:08推出“HUAWEI Mate 60 Pro先锋计划”,让部分消费者提前体验。在华为商城看到,华为Mate 60 pro手机已上架,售价6999元,提供雅川青、白沙银、南糯紫、雅丹黑四种配色供选择。 据介绍,华为在卫星通信领域…...
Linux系列讲解 —— 【systemd】下载及编译记录
Ubuntu18.04的init程序合并到了systemd中,本篇文章记录一下systemd的下载和编译。 1. 下载systemd源码 (1) 查看systemd版本号,用来确定需要下载的分支 sunsun-pc:~$ systemd --version systemd 237 PAM AUDIT SELINUX IMA APPARMOR SMACK SYSVINIT UT…...
u-view 的u-calendar 组件设置默认日期后,多次点击后,就不滚动到默认日期的位置
场景:uniapp开发微信小程序 vue2 uview版本:2.0.36 ; u-calendar 组件设置默认日期后 我打开弹窗,再关闭弹窗, 重复两次 就不显示默认日期了 在源码中找到这个位置进行打印值,根据出bug前后的值进行…...
vue naive ui 按钮绑定按键
使用vue (naive ui) 绑定Enter 按键 知识点: 按键绑定Button全局挂载使得message,notification, dialog, loadingBar 等NaiveUI 生效UMD方式使用vue 与 naive ui将vue默认的 分隔符大括号 替换 为 [[ ]] <!DOCTYPE html> <html lang"en"> <head>…...
Viobot基本功能使用及介绍
设备拿到手当然是要先试一下效果的,这部分可以参考本专栏的第一篇 Viobot开机指南。 接下来我们就从UI开始熟悉这个产品吧! 1.状态 设备上电会自动运行它的程序,开启了一个服务器,上位机通过连接这个服务器连接到设备,…...
DAMO-YOLO赛博朋克UI实战:CSS3神经突触动画+玻璃拟态设计解析
DAMO-YOLO赛博朋克UI实战:CSS3神经突触动画玻璃拟态设计解析 今天,我们来聊聊如何把一个顶级的AI视觉引擎,包装成一个让人看一眼就忘不掉的“赛博朋克控制台”。你可能会好奇,一个目标检测系统,界面做得再酷有什么用&…...
毕业季论文救星:深度解析百考通AI如何智能攻克文献综述与开题报告
又到一年毕业季,无数莘莘学子在为自己学术生涯的“终极答卷”——毕业论文而挑灯夜战。其中,文献综述的浩如烟海与开题报告的千头万绪,无疑是横亘在大多数同学面前的两座大山。你是否也曾面对海量文献不知如何筛选梳理?是否为构建…...
Telegram用户必看:Grok聊天机器人全功能实测与隐藏技巧大公开
Telegram用户必看:Grok聊天机器人全功能实测与隐藏技巧大公开 作为Telegram深度用户,你可能已经注意到聊天界面顶部多了一个新面孔——Grok聊天机器人。这款由xAI打造的AI助手正在悄然改变我们的通讯体验。不同于市面上大多数聊天机器人,Grok…...
终极RippleEffect测试指南:5步确保Android波纹动画质量的完整策略
终极RippleEffect测试指南:5步确保Android波纹动画质量的完整策略 【免费下载链接】RippleEffect Implementation of Ripple effect from Material Design for Android API 9 项目地址: https://gitcode.com/gh_mirrors/ri/RippleEffect RippleEffect是一款为…...
用PyTorch和snnTorch库5分钟搞定一个脉冲神经网络(SNN)手写数字识别Demo
用PyTorch和snnTorch库5分钟搞定一个脉冲神经网络(SNN)手写数字识别Demo 脉冲神经网络(SNN)作为第三代神经网络模型,正逐渐从学术研究走向工业应用。与传统人工神经网络不同,SNN通过模拟生物神经元的脉冲发…...
macOS下OpenClaw调试技巧:GLM-4.7-Flash接口连接问题排查
macOS下OpenClaw调试技巧:GLM-4.7-Flash接口连接问题排查 1. 问题背景与前期准备 上周在尝试将本地部署的GLM-4.7-Flash模型接入OpenClaw时,我遇到了三个典型问题:网关端口被占用、模型地址配置错误、以及Token消耗异常。这些问题导致自动化…...
零基础上手!基于vLLM的GLM-4-9B-Chat-1M模型保姆级部署指南
零基础上手!基于vLLM的GLM-4-9B-Chat-1M模型保姆级部署指南 1. 模型简介与核心优势 GLM-4-9B-Chat-1M是智谱AI推出的最新一代开源对话模型,基于vLLM框架部署,支持惊人的1M上下文长度(约200万中文字符)。这个模型在多…...
终极指南:如何用WeChatExtension-ForMac插件彻底改变你的微信体验
终极指南:如何用WeChatExtension-ForMac插件彻底改变你的微信体验 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 你是否觉得…...
基于遗忘因子递推最小二乘法的电池模型参数在线辨识与优化
1. 电池模型参数辨识为什么需要FFRLS算法 我第一次接触电池参数辨识是在开发一款智能硬件时,当时发现传统最小二乘法有个致命问题——它会把所有历史数据同等对待。这就像用算盘计算平均数时,不管数据是昨天还是去年的,都按相同权重处理。但在…...
别再直接升glibc 2.25了!CentOS7下从2.17平滑升级到2.31的保姆级排雷手册
CentOS7下glibc升级避坑实战:从2.17到2.31的安全跃迁指南 当你在CentOS7服务器上部署最新中间件时,那个熟悉的报错信息又出现了——"GLIBC_2.25 not found"。作为运维老兵,我太了解这种被glibc版本束缚的无力感。但别急着执行yum u…...
