滑动窗口—满足XX条件的最长子串
目录
题目一:3. 无重复字符的最长子串
题目二:159. 至多包含两个不同字符的最长子串
题目三:159. 至多包含两个不同字符的最长子串
题目一:3. 无重复字符的最长子串
问题描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。比如输入: s = "abcabcbb",输出: 3 ,解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
算法思路:
暴力解法时间复杂度较高,会达到 ,故而采取滑动窗口的方法降低时间复杂度。定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值为字符位置 +1,加 1 表示从字符位置后一个才开始不重复。我们定义不重复子串的开始位置为 start,结束位置为 end。随着 end 不断遍历向后,会遇到与 [start, end] 区间内字符相同的情况,此时将字符作为 key 值,获取其 value 值,并更新 start,此时 [start, end] 区间内不存在重复字符。无论是否更新 start,都会更新其 map 数据结构和结果 ans。
时间复杂度:O(n)。
上段文字出自:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/
图解:
参考代码:
class Solution {public int lengthOfLongestSubstring(String s) {int len = s.length();int res = 0;Map<Character,Integer> map = new HashMap<>();for(int end=0, start=0; end<len; end++){char alpha = s.charAt(end);if(map.containsKey(alpha))start = Math.max(start,map.get(alpha));res = Math.max(res, end-start+1);map.put(alpha,end+1);}return res;}
}
题目二:159. 至多包含两个不同字符的最长子串
问题描述:
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。比如输入: "eceba",输出: 3,解释: t 是 "ece",长度为3。
算法思路:
为了遍历一遍就得到答案,我们使用一个左指针和一个右指针表示滑动窗口的边界。一开始,让两个指针都指向 0 ,当窗口包含的字符不超过 2 个不同的字符时,就不断将右指针往右边移动。如果在某一个位置有 3 个不同的字符,就开始移动左指针,直到窗口内包含不超过 2 个不同字符。
这就是基本的想法:沿着字符串移动滑动窗口,并保持窗口内只有不超过 2 个不同字符,同时每一步都更新最长子串的长度。
只有一个问题还没解决 - 如何移动左指针确保窗口内只有 2 种不同的字符?我们使用一个 hashmap ,把字符串里的字符都当做键,在窗口中的最右边的字符位置作为值。每一个时刻,这个 hashmap 包括不超过 3 个元素。
比方说,通过这个 hashmap ,你可以知道窗口 "eeeeeeeet" 中字符 e 最右边的位置是 8 ,所以必须要至少将左指针移动到 8 + 1 = 9 的位置来将 e 从滑动窗口中移除。我们的方法时间复杂度是否是最优的呢?答案是是的。我们只将字符串的 N 个字符遍历了一次,时间复杂度是O(N) 。
链接:https://leetcode-cn.com/problems/longest-substring-with-at-most-two-distinct-characters/solution/zhi-duo-bao-han-liang-ge-bu-tong-zi-fu-de-zui-chan/
参考代码:
class Solution {public int lengthOfLongestSubstringTwoDistinct(String s) {int res = 0, len = s.length();HashMap<Character, Integer> hm = new HashMap<Character, Integer>();for(int end=0,start=0; end<len; end++){char alpha = s.charAt(end);if(hm.size()<3)hm.put(alpha,end);if(hm.size()==3){int index = Collections.min(hm.values());start = index + 1;hm.remove(s.charAt(index));}res = Math.max(res, end-start+1);}return res;}
}
题目三:159. 至多包含两个不同字符的最长子串
问题描述:
给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t ,并返回该子串的长度。比如输入: "eceba",输出: 3,解释: t 是 "ece",长度为3。
算法思路:
滑动窗口—满足XX条件的最长子串相关推荐
- 滑动窗口算法基本原理与实践
原文作者:huansky 原文地址:滑动窗口算法基本原理与实践 目录 滑动窗口算法(Sliding Window Algorithm) 基本示例 滑动窗口法的大体框架 算法实例 1208. 尽可能使字 ...
- leetcode刷题笔记-数组-滑动窗口
一.滑动窗口的常见问题分析 问题 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, - ...
- 牛客多校6 - K-Bag(哈希+滑动窗口)
题目链接:点击查看 题目大意:k-bag 序列的定义是由多个 1 ~ k 的排列顺序连接起来的序列,现在问给定的序列是不是 k-bag 的连续子串 题目分析:读完题目后,如果给定的序列是 k-bag ...
- python实现滑动窗口平均_Python之滑动窗口
对于一个数组array = ["n","v","l","f",...,"y","c&quo ...
- leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k .返回这一子串的长度. 示例 1: 输入:s = "aaabb", ...
- 力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法
无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...
- 滑动窗口1——无重复字符的最长字串
滑动窗口本质是一个队列,输入进入这个窗口(队列),当不满足条件时,移动这个队列: 如何移动,只需要将左边的元素移除即可,直到满足条件. import java.util.HashSet; import ...
- LeetCode 674. 最长连续递增序列 (滑动窗口 计数法)
LeetCode 674. 最长连续递增序列 滑动窗口 右边界不断往右移动 左边界收缩条件:当右边界的值小于等于其左边的值时(递减) 左边界收缩到右边界当前位置 class Solution {pub ...
- LeetCode 3. 无重复字符的最长子串 (滑动窗口哈希表)
3. 无重复字符的最长子串 题意: 找子串 子串中无重复字符 要求子串长度最长 解法1(暴力法) 思路: 建立一个长度不断变小的滑动窗口 用一个指针指针扫描窗口内的每个元素: 如果除去指针指向的那个元 ...
最新文章
- 谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...
- iOS 11开发教程(九)iOS11数据线连接真机测试
- 4G网络在物联网应用中的重要性
- SpringBoot实战 之 异常处理篇
- 90%的人都不会做的一道笔试题
- [vue] 你有使用过JSX吗?说说你对JSX的理解
- 全栈深度学习第1期:如何启动一个机器学习项目?
- linux中top和ps的内存区别,linux - top与ps间的区别
- spark 广播变量大数据_大数据处理 | Spark集群搭建及基本使用
- 1.3编程基础之算术表达式与顺序执行 03 计算(a+b) c的值
- 通用汽车再次提高自动驾驶与电动汽车投资 增至350亿美元
- STM32不同型号单片机keil工程移植说明
- Library Monkey Pro for Mac(专业的音频控制整理工具)
- 计算机术语中cook,计算机中的cookie是什么意思
- IDEA jsp中文乱码
- 【ROOT from CERN】——TCanvas绘制画布
- 肝了一晚上搞出来一个微信订阅号鉴黄机器人
- EVE-NG Lab通过Cloud连接外网
- python求n次方的函数_python实现pow函数(求n次幂,求n次方)
- 2010年工程硕士GCT考试应试策略
热门文章
- Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文
- Backbone Model——数据模型
- SPOJ 375 query on a tree 树链剖分
- vs2010 学习Silverlight学习笔记(15):数据与通信之JSON
- Vista上远程管理Hyper-V服务器
- vue子组件改变父组件的值
- java连接mysql数据库jdbc
- 2017-2018-1 20155223 实验三 实时系统
- 第一次刷Leetcode,为什么耗费很多时间
- 四则运算关于加括号的思路