接下来我会找出LeetCode中一些比较有代表性的题,带来它的算法和讲解

很多题目,使用一般的暴力算法很多都能解出来,但时间复杂度可能是 O(n3),会比最优解慢很多,尤其是数据量变大时。

在我们实际项目中编写代码时会遇到各种情况,组织数据,处理数据,如果能在特定的情况使用特定的算法,就可以发挥事半功倍的效果,很有现实意义。

原题链接

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 :
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

暴力

这是一个比较经典的问题,查找无重复最长子串。

先看我最开始给出的解法

思路比较简单,借助Set,我可以很快的判断一个字符是否在一个集合里

从第一个字符开始开始遍历每个字符,然后从这个字符开始到最后一个字符,依次加入Set

如果Set没有就加入,一旦出现重复判断之前的最长长度和当前的最长长度,取较大值,Set清空

class Solution {public int lengthOfLongestSubstring(String s) {Set<Integer> t = new HashSet<>();int max = 0;for (int i = 0; i < s.length(); i++) {for (int j = i; j < s.length(); j++) {int a = s.charAt(j);if (!t.contains(a)) {t.add(a);} else {max = t.size() > max ? t.size() : max;t.clear();break;}}}if(t.size() > max){max = t.size();}return max;}
}

滑动窗口

先看解法

class Solution {public int lengthOfLongestSubstring(String s) {int max = 0;Set<Character> t = new HashSet<>();for (int i = 0, j = 0; i < s.length(); ) {if (j >= s.length()) {break;}if (!t.contains(s.charAt(j))) {t.add(s.charAt(j));max = Math.max(max, j - i +1);j++;}else{t.remove(s.charAt(i++));}}return max;}
}

暴力法有个明显的问题,比如我判断 abcabcbb

在第一字符时判断

a
ab
abc
abca

在第二个字符时判断

b
bc
bca

会有大量重复且不必要的判断

那么怎么避免呢

当我判断第一个字符到 abca 时,不在完全退回第二个字符重新判断,而是保留右侧的配置,左侧右移一位,那么现在就成了不重复时右侧游标右移,存在重复字符时,左侧游标右移,同时记录中间的最长长度

左侧游标和右侧游标依次滑动右移,就仿佛是一个会移动的窗口,中间的某个最大长度即为不含有重复字符的最长子串

滑动窗口优化

当我们遇到一个字符串pasdsad,使用上述算法

p
pa
pas
pasd
asd
sd
d
ds

因为下一个字符是s,所以左侧游标移动了3次才移除了当前窗口内s

但是如果直接能跳到s位置呢

那么又会减少很多次操作

class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length(), ans = 0;Map<Character, Integer> map = new HashMap<>();for (int j = 0, i = 0; j < n; j++) {if (map.containsKey(s.charAt(j))) {i = Math.max(map.get(s.charAt(j)), i);}ans = Math.max(ans, j - i + 1);map.put(s.charAt(j), j + 1);}return ans;}
}

通过Map映射记录上一个重复字符的位置,发生重复是可使左侧游标直接跳到之前的重复位置。

关注我的Github项目,开启Java进阶之路,欢迎star

Asens/Java-Advance​github.com

cstring判断是否包含子串_最长子串-滑动窗口相关推荐

  1. 学渣的刷题之旅 leetcode刷题 3. 无重复字符的最长子串(暴力法、滑动窗口)

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

  2. uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!

    大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...

  3. Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析

    题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有 ...

  4. cstring判断是否包含子串_leetcode76. 最小覆盖子串

    leetcode76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串. 示例: 输入: S = "ADOBECODEBANC&qu ...

  5. 字符串最长回文子串_最长回文子串

    字符串最长回文子串 Problem statement: 问题陈述: Given a string str, find the longest palindromic substring. A sub ...

  6. 最长递增子序列 子串_最长递增奇偶子序列

    最长递增子序列 子串 Problem statement: 问题陈述: Given a sequence of numbers you have to find out the length of t ...

  7. 最长递增子序列 子串_最长递增子序列

    最长递增子序列 子串 Description: 描述: This is one of the most popular dynamic programming problems often used ...

  8. python判断字符串包含中文_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...

    在python3中,str默认是unicode编码 用 ord() 函数判断单个字符的unicode编码是否大于255即可. 一般来说,中文常用字的范围是:[\u4e00-\u9fa5] 准确点判断中 ...

  9. LeetCode 1234. 替换子串得到平衡字符串(滑动窗口)

    1. 题目 有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串. 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」. 给你一个这样的字 ...

最新文章

  1. 使用C++实现一套简单的状态机模型——实例
  2. mysql聚簇索引的页分裂原理实例分析
  3. Leetcode 648.单词替换
  4. orm和mysql_orm与mysql
  5. 方法重载 java 1614780176
  6. python在csv模块添加新列_如何在CSV文件的开头添加新列?
  7. redhat 6.4 虚拟化平台搭建千万PV架构
  8. Delphi 的并行计算
  9. 零信任在智慧城市典型场景中的融合应用
  10. 【问题日记】windows11 找不到组策略问题解决
  11. pmp中ram和raci的区别_【PMP考前冲刺】知识点大全(四)
  12. 「文献解读」利用基因沉默和过表达技术研究棉花的基因功能
  13. MFC Windows 程序设计[315]之磁盘文件列举器(附源码)
  14. <el-upload>组件拖曳无法上传问题
  15. 【音视频专题】音频质量评估方法那些事
  16. Arduino入门:按钮升级(按一下按钮,LED亮,再按一下,LED熄灭)
  17. PLSQL 下载地址 Spring jar包
  18. 正则表达式验证座机号码,手机号等
  19. con和com开头单词规律_英语成绩总上不了120分?问题出在背单词!
  20. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

热门文章

  1. html文本分类输出,构建中文网页分类器对网页进行文本分类
  2. catia将板环形弯成圆_3.4.3-Catia变换之圆形阵列命令
  3. QLineEdit的readonly、disable属性的区别
  4. htcvr设备计算机配置,准备买HTC VIVE了?来测试一下你的电脑配置够不够
  5. php图片抖动,css3,jquery_css3图片抖动,css3,jquery - phpStudy
  6. 64 源码_【ClickHouse内核】源码阅读策略
  7. AFNetworking 学习笔记
  8. html5中单选按钮的互斥应该,HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第6章表格与表单...
  9. legend2---开发日志16
  10. Beta 冲刺(3/7)