这个解法是由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;
}

无重复字符最长字串的滑动窗口结合哈希表解法(注释详尽)相关推荐

  1. LeetCode【3--无重复的最长字串】 LeetCode【4--有序数组中的中位数】

    无重复的最长字串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 解题思路 看到这道题,其实就两个步骤,遍历字符串,记录当前字符有没有重复. 重复一般解决就是哈希,这里用个 ...

  2. LeetCode / Scala - 无重复字符最长子串 ,最长回文子串

    一.引言 LeetCode 里有一类字符子串问题,这里主要分析无重复字符的最长子串与最长回文子串,总结相关方法. 二.无重复字符最长子串 1.题目要求 给定字符串 s,要求找出字符内无重复的最长子串, ...

  3. leetcode3 无重复字符最长子串

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

  4. leetcode76:最小覆盖字串(滑动窗口)

    一:题目 二:思路 思路拿别人的,感觉写的很nice!! 渣渣杰只能膜拜大佬的了 1.滑动窗口的思想: left 指针和 ring 指针,保证两个指针之间的字符串包含所需要的全部字符. 2在保证 1 ...

  5. Leecode刷题热题HOT100(3)——无重复字符最长子串

  6. 力扣第三题 无重复字符的最长子串

    有啥不懂的评论区可以问 ### 解题思路 双指针指向无重复字符的最长字串   而双指针构成的那部分可以看成一个滑动窗口  中间运用双for循环 外面for循环遍历整个字符串,内循环遍历整个滑动窗口   ...

  7. LeetCode中等题之无重复字符的最长字串

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

  8. python leetcode_python实现leetcode中无重复字符的最长字串

    ​无重复字符的最长字串是一道经典的额字符串处理算法的题目,日常编程过程中,处理字符串是很多见的.用Python来实现leetcode这道算法题,这题会涉及到一个概念"滑动窗口"的概 ...

  9. [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]

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

最新文章

  1. 短视频个性化Push工程精进之路
  2. (完全解决)Key already registered with the same priority: GroupSpatialSoftmax
  3. Linux常用的文本查找命令 find
  4. 服务器收集错误信息0不动,win10系统提示“我们只收集某些错误信息”的解决方案...
  5. 征战蓝桥 —— 2013年第四届 —— C/C++A组第8题——买不到的数目
  6. php斯芬克斯,斯芬克斯之迷——ie私有属性haslayout的困扰
  7. 链表排序 Sort List
  8. c# define 类似_c#跟c++的相似之处
  9. 帛书《要》篇“夫子老而好易”章
  10. 高级辅助驾驶(ADAS)整理(炒鸡详细)
  11. jhin 不在 sudoers 文件中。此事将被报告。
  12. javascript 忽略 报错_JavaScript数据类型中易被忽略的点
  13. windows消息分类PostMessage、SendMessage
  14. api 微信内置浏览器js_【微网站开发】之微信内置浏览器API使用
  15. 【生成密钥免密登陆服务器】
  16. 产品设计公司的头脑风暴是什么?
  17. 百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析
  18. 一个古老软件工具的逆向重生
  19. Eclipse环境设置导出
  20. Android各种问题解决

热门文章

  1. python历史上的今天_历史上的今天接口调用示例
  2. stata画图命令_STATA计量研究/面板单位根检验分析(含代码)
  3. 零基础学python大概要多久-怎么自学python,大概要多久?
  4. 廖雪峰python教程-福利 | 廖雪峰官方Python教程,拿走不谢!
  5. 下载python教程-python教程pdf下载
  6. python和java的区别-java和python的区别
  7. python是什么软件-python是什么软件
  8. 普通人学python有什么用-学python日常工作有什么用?
  9. Express中间件(非常详细)
  10. ib交换机 postgresql_postgresql关于访问视图需要的权限