每天一道leetcode(Day 4)


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

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例

  • 示例一
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
  • 示例二
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
  • 示例三
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题思路

设置一个左游标,记录不重复子字符串的在整个字符串中的左边的起始位置,依次循环整个 str,当找到重复字符时候,左游标右移,移动的距离是,当前左游标加上子字符串中找到重复字符的位置索引;

代码

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  if (!s.length) return 0;
  let curStr = ""; // 每次循环找到的不含重复字符的子字符串
  let maxStrLen = 0; // 最大不含重复字符的子字符串的长度
  const len = s.length;
  let left = 0; // 不含重复字符的子字符串的左游标
  for (let i = 0; i < len; i++) {
    if (curStr.indexOf(s[i]) !== -1) {
      left += s.slice(left, i).indexOf(s[i]) + 1;
      continue;
    }
    //slice(start,end)截取字符串不包括end位置处的元素,所以这里要加上一个1
    curStr = s.slice(left, i + 1);
    maxStrLen = Math.max(maxStrLen, curStr.length);
  }
  return maxStrLen;
};

参考

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


文章作者: CassielLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CassielLee !
评论
  目录