Leetcode刷题(第3题)——无重复字符的最长子串

x33g5p2x  于2022-02-21 转载在 其他  
字(0.7k)|赞(0)|评价(0)|浏览(328)

一、题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
二、示例

  1. 示例一:
  2. 输入: s = "abcabcbb"
  3. 输出: 3
  4. 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
  5. 示例二:
  6. 输入: s = "bbbbb"
  7. 输出: 1
  8. 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1

三、思路
可以使用双指针left和right指针,右指针遍历当前字符串的每一个下标,并且使用一个哈希表来保存当前字符串的值以及其下标。如果当前的值已经在map中存在,并且重复值的下标大于或者等于left的值,此时需要移动左指针,将其移动到重复的值的下一位。然后不断的向map中放入值(如果重复则会被覆盖),以及不断的计算max的值。
四、代码

  1. /**
  2. * @param {string} s
  3. * @return {number}
  4. */
  5. var lengthOfLongestSubstring = function(s) {
  6. let left = 0;
  7. let max = 0;
  8. let map = new Map()
  9. let length = s.length
  10. for(let right = 0; right < length; right++) {
  11. if(map.has(s[right]) && map.get(s[right]) >= left) {
  12. left = map.get(s[right]) + 1
  13. }
  14. map.set(s[right], right)
  15. max = Math.max(max, right - left + 1)
  16. }
  17. return max
  18. };

五、分析
时间复杂度为O(n),空间复杂度为O(n).

相关文章