【算法-剑指 Offer】48. 最长不含重复字符的子字符串(滑动窗口;双指针)

剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣(LeetCode)

文章更新:2021年10月11日13:00:59

问题描述及示例

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

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

示例 4:
输入: s = “”
输出: 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

提示:
s.length <= 40000

我的题解

我的题解1(滑动窗口)

这题之前用滑动窗口做过,可以看下面的博客:

参考:【算法-LeetCode】3. 无重复字符的最长子串(滑动窗口)_赖念安的博客-CSDN博客

我的题解2(双指针(其实也是滑动窗口))

这次我用 ij 两个指针来模拟滑动窗口。其大体思路还是一样的。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  // 用两个指针来模拟滑动窗口
  let i = 0;
  let j = 1;
  // max用于记录遍历过程中遇到的最长无重复子串
  let max = 0;
  // 用 j 指针开始遍历 s
  for(;j < s.length; j++) {
    // 如果当前遍历元素已经存在于当前窗口内
    if(s.substring(i, j).includes(s[j])) {
      // 则更新max的值
      max = Math.max(max, j - i);
      // 并且更新 i 指针的位置,这里用 s[i] === s[j] 做判断是为了应对类似 aab 这种情况
      i = s[i] === s[j] ? i + 1 : s.lastIndexOf(s[j], j - 1) + 1;
    }
  }
  // 最后如果 s 为空字符串,则返回 0,否则返回最长的那个滑动窗口的长度
  // 需要注意的一点是,当上面的循环结束时,j 的值是 s.length
  return s.length ? Math.max(max, j - i) : 0;
};


提交记录
987 / 987 个通过测试用例
状态:通过
执行用时:92 ms, 在所有 JavaScript 提交中击败了70.95%的用户
内存消耗:41.4 MB, 在所有 JavaScript 提交中击败了62.23%的用户
时间:2021/10/11 13:05

为啥这性能好像还下降了?搞不明白,这结果也就随缘吧,不能太当真……

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年7月29日20:03:26

参考:3. 无重复字符的最长子串 题解 - 力扣(LeetCode)

更新:2021年10月11日13:16:42

精选题解参考:面试题48. 最长不含重复字符的子字符串(动态规划 / 双指针 + 哈希表,清晰图解) - 最长不含重复字符的子字符串 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年10月11日13:07:17
参考:【算法-LeetCode】3. 无重复字符的最长子串(滑动窗口)_赖念安的博客-CSDN博客
更新:2021年7月20日11:18:32
参考:Array.prototype.splice() - JavaScript | MDN
更新:2021年9月2日14:04:11
参考:【微信公众号:三分钟学前端 2021-09-02】每日算法:无重复字符的最长子串
更新:2021年10月11日13:04:36
参考:String.prototype.substring() - JavaScript | MDN
参考:String.prototype.lastIndexOf() - JavaScript | MDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值