目录

题目一: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条件的最长子串相关推荐

  1. 滑动窗口算法基本原理与实践

    原文作者:huansky 原文地址:滑动窗口算法基本原理与实践 目录 滑动窗口算法(Sliding Window Algorithm) 基本示例 滑动窗口法的大体框架 算法实例 1208. 尽可能使字 ...

  2. leetcode刷题笔记-数组-滑动窗口

    一.滑动窗口的常见问题分析 问题 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, - ...

  3. 牛客多校6 - K-Bag(哈希+滑动窗口)

    题目链接:点击查看 题目大意:k-bag 序列的定义是由多个 1 ~ k 的排列顺序连接起来的序列,现在问给定的序列是不是 k-bag 的连续子串 题目分析:读完题目后,如果给定的序列是 k-bag ...

  4. python实现滑动窗口平均_Python之滑动窗口

    对于一个数组array = ["n","v","l","f",...,"y","c&quo ...

  5. leetcode 395. 至少有 K 个重复字符的最长子串(滑动窗口)

    给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k .返回这一子串的长度. 示例 1: 输入:s = "aaabb", ...

  6. 力扣3. 无重复字符的最长子串 two pointer算法|滑动窗口|尺取法

    无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 & ...

  7. 滑动窗口1——无重复字符的最长字串

    滑动窗口本质是一个队列,输入进入这个窗口(队列),当不满足条件时,移动这个队列: 如何移动,只需要将左边的元素移除即可,直到满足条件. import java.util.HashSet; import ...

  8. LeetCode 674. 最长连续递增序列 (滑动窗口 计数法)

    LeetCode 674. 最长连续递增序列 滑动窗口 右边界不断往右移动 左边界收缩条件:当右边界的值小于等于其左边的值时(递减) 左边界收缩到右边界当前位置 class Solution {pub ...

  9. LeetCode 3. 无重复字符的最长子串 (滑动窗口哈希表)

    3. 无重复字符的最长子串 题意: 找子串 子串中无重复字符 要求子串长度最长 解法1(暴力法) 思路: 建立一个长度不断变小的滑动窗口 用一个指针指针扫描窗口内的每个元素: 如果除去指针指向的那个元 ...

最新文章

  1. 谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...
  2. iOS 11开发教程(九)iOS11数据线连接真机测试
  3. 4G网络在物联网应用中的重要性
  4. SpringBoot实战 之 异常处理篇
  5. 90%的人都不会做的一道笔试题
  6. [vue] 你有使用过JSX吗?说说你对JSX的理解
  7. 全栈深度学习第1期:如何启动一个机器学习项目?
  8. linux中top和ps的内存区别,linux - top与ps间的区别
  9. spark 广播变量大数据_大数据处理 | Spark集群搭建及基本使用
  10. 1.3编程基础之算术表达式与顺序执行 03 计算(a+b) c的值
  11. 通用汽车再次提高自动驾驶与电动汽车投资 增至350亿美元
  12. STM32不同型号单片机keil工程移植说明
  13. Library Monkey Pro for Mac(专业的音频控制整理工具)
  14. 计算机术语中cook,计算机中的cookie是什么意思
  15. IDEA jsp中文乱码
  16. 【ROOT from CERN】——TCanvas绘制画布
  17. 肝了一晚上搞出来一个微信订阅号鉴黄机器人
  18. EVE-NG Lab通过Cloud连接外网
  19. python求n次方的函数_python实现pow函数(求n次幂,求n次方)
  20. 2010年工程硕士GCT考试应试策略

热门文章

  1. Unity3d Fast Indirect illumination Using Two Virtual Spherical Gaussian Lights-Square Enix论文
  2. Backbone Model——数据模型
  3. SPOJ 375 query on a tree 树链剖分
  4. vs2010 学习Silverlight学习笔记(15):数据与通信之JSON
  5. Vista上远程管理Hyper-V服务器
  6. vue子组件改变父组件的值
  7. java连接mysql数据库jdbc
  8. 2017-2018-1 20155223 实验三 实时系统
  9. 第一次刷Leetcode,为什么耗费很多时间
  10. 四则运算关于加括号的思路