cstring判断是否包含子串_最长子串-滑动窗口
接下来我会找出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-Advancegithub.com
cstring判断是否包含子串_最长子串-滑动窗口相关推荐
- 学渣的刷题之旅 leetcode刷题 3. 无重复字符的最长子串(暴力法、滑动窗口)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- uiautomation遍历windows所有窗口_万字长文!滑动窗口看这篇就够了!
大家好,我是小浩.今天是小浩算法 "365刷题计划" 滑动窗口系列 - 整合篇.之前给大家讲解过一些滑动窗口的题目,但未作系统整理. 所以我就出了这个整合合集,整合工作中除了保留原 ...
- Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析
题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有 ...
- cstring判断是否包含子串_leetcode76. 最小覆盖子串
leetcode76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串. 示例: 输入: S = "ADOBECODEBANC&qu ...
- 字符串最长回文子串_最长回文子串
字符串最长回文子串 Problem statement: 问题陈述: Given a string str, find the longest palindromic substring. A sub ...
- 最长递增子序列 子串_最长递增奇偶子序列
最长递增子序列 子串 Problem statement: 问题陈述: Given a sequence of numbers you have to find out the length of t ...
- 最长递增子序列 子串_最长递增子序列
最长递增子序列 子串 Description: 描述: This is one of the most popular dynamic programming problems often used ...
- python判断字符串包含中文_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...
在python3中,str默认是unicode编码 用 ord() 函数判断单个字符的unicode编码是否大于255即可. 一般来说,中文常用字的范围是:[\u4e00-\u9fa5] 准确点判断中 ...
- LeetCode 1234. 替换子串得到平衡字符串(滑动窗口)
1. 题目 有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串. 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」. 给你一个这样的字 ...
最新文章
- 使用C++实现一套简单的状态机模型——实例
- mysql聚簇索引的页分裂原理实例分析
- Leetcode 648.单词替换
- orm和mysql_orm与mysql
- 方法重载 java 1614780176
- python在csv模块添加新列_如何在CSV文件的开头添加新列?
- redhat 6.4 虚拟化平台搭建千万PV架构
- Delphi 的并行计算
- 零信任在智慧城市典型场景中的融合应用
- 【问题日记】windows11 找不到组策略问题解决
- pmp中ram和raci的区别_【PMP考前冲刺】知识点大全(四)
- 「文献解读」利用基因沉默和过表达技术研究棉花的基因功能
- MFC Windows 程序设计[315]之磁盘文件列举器(附源码)
- <el-upload>组件拖曳无法上传问题
- 【音视频专题】音频质量评估方法那些事
- Arduino入门:按钮升级(按一下按钮,LED亮,再按一下,LED熄灭)
- PLSQL 下载地址 Spring jar包
- 正则表达式验证座机号码,手机号等
- con和com开头单词规律_英语成绩总上不了120分?问题出在背单词!
- max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
热门文章
- html文本分类输出,构建中文网页分类器对网页进行文本分类
- catia将板环形弯成圆_3.4.3-Catia变换之圆形阵列命令
- QLineEdit的readonly、disable属性的区别
- htcvr设备计算机配置,准备买HTC VIVE了?来测试一下你的电脑配置够不够
- php图片抖动,css3,jquery_css3图片抖动,css3,jquery - phpStudy
- 64 源码_【ClickHouse内核】源码阅读策略
- AFNetworking 学习笔记
- html5中单选按钮的互斥应该,HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第6章表格与表单...
- legend2---开发日志16
- Beta 冲刺(3/7)