3无重复字符的最长子串longest-substring-without-repeating-characters
描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
题解
从左边字符开始向右寻找最长符合要求的字符串,找到之后从左边第二个字符开始再次寻找…当左边开始的字符已经是最后一个字符了我们的遍历就结束了,这很暴力。优化!
维护一个滑动窗口,窗口内(当前窗口l到r)都是没有重复的字符,判断窗口外的下一个字符r+1是否在窗口内出现过,没有出现过去尽可能的扩大窗口的大小,窗口不停的向右滑动r++。
- 如果当前遍历到的字符从未出现过,那么直接扩大右边界r++;
- 如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动)l–,然后继续观察当前遍历到的字符;
- 重复上述步骤,直到左边索引无法再移动(到达字符串长度);
- 维护一个最大窗口长度length,每次用出现过的窗口大小来更新最大窗口长度length,最后返回length。
代码
public static int lengthOfLongestSubstring(String s) {int maxLen = 0;//最大窗口长度int l=0,r=-1 ;//r作为当前遍历字符,初始化-1时便于理解窗口外下一个字符r+1,左边界初始化0int[] hashIndexs=new int[256];Arrays.fill(hashIndexs,0);//建立字符和其出现位置之间的映射,字符从a到z对应的ASCLL码97到122,出现一次则加1,保证窗口内字符只出现过一次,映射值都为0while (l<s.length()){//如果窗口的下一个字符r+1在窗口未出现过,且下一个字符未超出字符串边界if(r+1<s.length()&&hashIndexs[s.charAt(r+1)]==0){r++;hashIndexs[s.charAt(r)]++;//出现次数}else {//窗口左边界右移,移出去的字符出现次数减去一hashIndexs[s.charAt(l)]--;l++;}if(r-l+1>maxLen){maxLen=r-l+1;}}return maxLen;}
另一种解法
创建hash数组,填入的值为该字符在原字符串中的下标
取最近出现的两次下标的最大值
取全局最大值
public static int lengthOfLongestSubstring(String s) {int curLen=0;int maxLen=0;int[] hashIndexs=new int[256];Arrays.fill(hashIndexs,-1);//填充各字符出现值都为-1for(int curI=0;curI<s.length();curI++){//curI为字符串第几个字符int preI=hashIndexs[s.charAt(curI)];//获取当前下标对应字符在hash表中的值,第一次为-1,后面更新为字符串中字符下标值,取最大的两者差值if(preI==-1||curI-preI>curLen){curLen++;//当前不重复字符串长度}else{maxLen = Math.max(maxLen, curLen);curLen=curI-preI;}hashIndexs[s.charAt(curI)]=curI;}maxLen = Math.max(maxLen, curLen);return maxLen;}
3无重复字符的最长子串longest-substring-without-repeating-characters相关推荐
- leetcode算法—无重复字符的最长子串 Longest Substring Without Repeating Characters
关注微信公众号:CodingTechWork,一起学习进步. 题目 Longest Substring Without Repeating Characters: Given a string, fi ...
- 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)
一.问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...
- 刻意练习:LeetCode实战 -- Task16. 无重复字符的最长子串
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- 【每日一算法】无重复字符的最长子串
微信改版,加星标不迷路! 每日一算法 - 无重复字符的最长子串 思路答案 首先定义一个指针p指向该字符串的链头,然后通过p指针后的第i个字符是否和p指针后的第j个字符相同来取得最大长度.(也叫做完全遍 ...
- 汇编语言求无符号数组中出现的次数最多数_【今日最佳leecode通俗易懂】无重复字符的最长子串...
相信看了这个标题的同学,对这道题以已经非常不陌生了,就是leecode当中的第三题,之所以要单独的写一写主要对我来说,里面涉及到有一个滑动窗口, 散列表, 字符编码等知识点比较重要,也有几个小技巧,这 ...
- 大二菜鸟———无重复字符的最长子串
这是一枚大二菜鸟的成长反思博客 终于忍不住,在这六月将之的一天开始写起了博客.数据结构计算机算法杂七杂八学了一堆但是都只是浅尝,觉得还是要写博客反刍学习到的知识. 感谢大佬 @Java3y 的 ...
- 无重复最长子串python_leetCode 无重复字符的最长子串 python(Longest Substring Without Repeating Characters) python...
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Default 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &quo ...
- 算法-------无重复字符的最长子串(Java版)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc& ...
- python学习3. 无重复字符的最长子串(滑动窗口)
makcooo 2019-04-19 15:47:32 271 收藏 分类专栏: python 版权 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: &quo ...
- 刷题练习记录(3)——无重复字符的最长子串(JAVA 和 Python)——set()函数/集合...
[题号003]无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的 ...
最新文章
- 【计算机网络】HTTP 与 HTTPS ( HTTPS 简介 | HTTP 通信过程 )
- mysql级联查询_mysql 各种级联查询后更新(update select)
- 【广州/深圳 活动】 MVP社区巡讲
- if ( document.all ) 可以简单的判断浏览器是否IE浏览器?
- DELPHI怎样编写COM组件
- iris数据集_sklearn日志(二)训练集和测试集划分
- CTime类,CTime 与 CString转换
- 大学生html电影网页设计作业成品 我喜欢的电影榜单题材网页制作代码 简单静态网页模板下载
- AutoCAD输出矢量图
- 谷歌创建新账号时手机号码无法验证
- MTK开发入门基础教程
- PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据...
- The kernel appears to have died. It will restart automatically
- 想成为“王者”的必备能力——领导力21法则
- springboot微信点餐系统项目设计
- 记录一次uni-app按导航栏左边返回,app闪退问题
- Spark 读取mysql表统计
- 使用C语言链表实现商品管理系统
- [行人重识别论文阅读]无监督学习发展与小结
- Redis设计与实现学习记录《一》
热门文章
- android 锁屏代码分析,锁屏分析(Android9.0)
- 每个前端工程师都应该了解的图片知识
- 知识图谱导论----相关笔记
- 云服务器Docker安装ElasticSearch却启动不了怎么办?
- Java+Springboot+Mybatis+Mysql+Bootstrap+Maven实现景区旅游管理系统
- 计算机文件只读模式,电脑文件只读模式如何修改 – 手机爱问
- 谷歌浏览器任务栏图标变白色解决方法(亲测有效!)
- CF1060F Shrinking Tree(期望、树形dp)
- 高效文件搜索工具Everything/Listary
- 整个网站网页变黑白的效果