[路飞]_leetcode-3-无重复字符的最长子串

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

[题目地址]

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
复制代码

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
复制代码

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。
复制代码

示例 4:

输入: s = ""
输出: 0
复制代码

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

本题要我们找到不含有重复字符的最长子串,只要遍历字符串中的每个字符,并记录当前子串,当新的字符在子串中出现过,则更新子串,并记录之前长度即可。详细解题思路如下:

  1. 特判当输入字符为空时,返回 0
  2. 创建变量 str 记录当前子串,初始化为空字符串,创建变量 max 记录最长子串长度,因为此时字符串不为空,所以初始化为 1
  3. 遍历字符串,如果该字符在 str 中没有出现过,则 str += s[i],否则通过当前子串长度尝试更新 max,然后更新当前子串为前一个重复字符之后的字符加 s[i]
  4. 最后返回 max 和最后子串的长度的最大值

代码如下:

var lengthOfLongestSubstring = function(s) {
  // 特判
  if(s==='') return 0;
  // 子串
  str = '',
  // 最长子串的长度
  max = 1;
  // 遍历每个字符
  for(let i = 0;i<s.length;i++){
    const ind = str.indexOf(s[i])
    // 如果该字符在子串中现过
    if(ind>-1){
      // 尝试更新最大子串长度
      max = Math.max(max,str.length)
      // 更新子串
      str = str.substr(ind+1)+s[i]
    }else{
      // 如果未出现过,累加字符串
      str += s[i]
    }
  }
  // 返回结果
  return Math.max(max,str.length);
};
复制代码

至此我们就完成了 leetcode-3-无重复字符的最长子串

如有任何问题或建议,欢迎留言讨论!

Guess you like

Origin juejin.im/post/7032475123705708558