无重复字符最长字串的滑动窗口结合哈希表解法(注释详尽)
这个解法是由leetcode上的jack这名用户上传,巧妙的使用了哈希表来缩短执行时间,非常值得学习,但是原作者并没有将原理和亮点讲的很清楚,所以我重新将它梳理了一遍发了出来。
思路:
这个解法是以常规的滑动思想为基础,字符串左右各一个指针(left和right),左边的指针标记的是最近的重复字符(初始值为0.表示暂无重复字符),然后right指针进行遍历,若遍历字符与目前两指针中间的字符串中字符重复,则将left指针移向该重复字符,right指针继续向前遍历,知道遍历结束为止,其中没遍历一个字符,都进行一次目前字符串长度与最长字符串长度的比较。
然后根据字符是由ASCII码表示的特点,创建一个256个元素的数组,作为哈希表,用于储存每一个字符最近出现位置,若未出现过,则为0,若出现了,则将其位置信息存入(即right的值),若第二次出现,则通过找到对应ASCII码值,就可知该字符最近一次出现位置,从而完成left指针的移动。
代码:
int lengthOfLongestSubstring(char * s){//用于储存目前最长字串int prior = 0;//用于定位目前不重复字符串的起始字符左边一个字符(即最近一个出现重复的字符)int left = 0;//用数组构建一个哈希表,存储该字符最近出现位置,若为0,则表示没有出现过,并且为256而不为128是因为此处是ASCII扩展字符集int dict[256] = {0};//目前所遍历的字符串的位置int right = 1;//存储目前字符的ASCII值int i;while (* s != '\0'){//获得目前字符的ASCII值i = * s - 0;//判断目前所遍历字符是否出现过if (dict[i] > left)//若出现过,则将目前不重复字符串起始位置之前的一位定位到该字符left = dict[i];//不论是否出现过,都更新该字母对应哈希表的值dict[i] = right;//判断目前不重复字符串长度是否比出现过的最长不重复字符串长prior = (prior>right-left)? prior : right-left;//将指针指向下一个字符s++;//更新为接下来要遍历的字符的位置right++;}return prior;
}
无重复字符最长字串的滑动窗口结合哈希表解法(注释详尽)相关推荐
- LeetCode【3--无重复的最长字串】 LeetCode【4--有序数组中的中位数】
无重复的最长字串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 解题思路 看到这道题,其实就两个步骤,遍历字符串,记录当前字符有没有重复. 重复一般解决就是哈希,这里用个 ...
- LeetCode / Scala - 无重复字符最长子串 ,最长回文子串
一.引言 LeetCode 里有一类字符子串问题,这里主要分析无重复字符的最长子串与最长回文子串,总结相关方法. 二.无重复字符最长子串 1.题目要求 给定字符串 s,要求找出字符内无重复的最长子串, ...
- leetcode3 无重复字符最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&q ...
- leetcode76:最小覆盖字串(滑动窗口)
一:题目 二:思路 思路拿别人的,感觉写的很nice!! 渣渣杰只能膜拜大佬的了 1.滑动窗口的思想: left 指针和 ring 指针,保证两个指针之间的字符串包含所需要的全部字符. 2在保证 1 ...
- Leecode刷题热题HOT100(3)——无重复字符最长子串
- 力扣第三题 无重复字符的最长子串
有啥不懂的评论区可以问 ### 解题思路 双指针指向无重复字符的最长字串 而双指针构成的那部分可以看成一个滑动窗口 中间运用双for循环 外面for循环遍历整个字符串,内循环遍历整个滑动窗口 ...
- LeetCode中等题之无重复字符的最长字串
题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...
- python leetcode_python实现leetcode中无重复字符的最长字串
无重复字符的最长字串是一道经典的额字符串处理算法的题目,日常编程过程中,处理字符串是很多见的.用Python来实现leetcode这道算法题,这题会涉及到一个概念"滑动窗口"的概 ...
- [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]
[问题描述][第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重 ...
最新文章
- 短视频个性化Push工程精进之路
- (完全解决)Key already registered with the same priority: GroupSpatialSoftmax
- Linux常用的文本查找命令 find
- 服务器收集错误信息0不动,win10系统提示“我们只收集某些错误信息”的解决方案...
- 征战蓝桥 —— 2013年第四届 —— C/C++A组第8题——买不到的数目
- php斯芬克斯,斯芬克斯之迷——ie私有属性haslayout的困扰
- 链表排序 Sort List
- c# define 类似_c#跟c++的相似之处
- 帛书《要》篇“夫子老而好易”章
- 高级辅助驾驶(ADAS)整理(炒鸡详细)
- jhin 不在 sudoers 文件中。此事将被报告。
- javascript 忽略 报错_JavaScript数据类型中易被忽略的点
- windows消息分类PostMessage、SendMessage
- api 微信内置浏览器js_【微网站开发】之微信内置浏览器API使用
- 【生成密钥免密登陆服务器】
- 产品设计公司的头脑风暴是什么?
- 百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析
- 一个古老软件工具的逆向重生
- Eclipse环境设置导出
- Android各种问题解决
热门文章
- python历史上的今天_历史上的今天接口调用示例
- stata画图命令_STATA计量研究/面板单位根检验分析(含代码)
- 零基础学python大概要多久-怎么自学python,大概要多久?
- 廖雪峰python教程-福利 | 廖雪峰官方Python教程,拿走不谢!
- 下载python教程-python教程pdf下载
- python和java的区别-java和python的区别
- python是什么软件-python是什么软件
- 普通人学python有什么用-学python日常工作有什么用?
- Express中间件(非常详细)
- ib交换机 postgresql_postgresql关于访问视图需要的权限