【算法-LeetCode】3. 无重复字符的最长子串(滑动窗口)

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

文章更新:2021年7月19日23:41:57

问题描述及示例

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

示例 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/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

我的题解

我的题解1

总体思路是用一个数组longestSubstring来动态存储最长无重复子串,用一个变量max动态保存longestSubstring的最大值(注意不是保存longestSubstring的当前值)。先是遍历所输入的s,同时检查longestSubstring里有没有当前遍历的那个字符(假设为x),如果有的话,就把longestSubstring中与当前遍历字符x重复的字符及其之前的所有字符删掉,然后再把字符x放入longestSubstring,同时更新max的值。最后遍历完成后,将max返回。

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
	// longestSubstrin用来动态存储最长无重复子串
    let longestSubstring = [];
	// 变量`max`动态保存`longestSubstring`的最大值(注意不是保存`longestSubstring`的当前值)
    let max = longestSubstring.length;
    for(let i = 0; i < s.length; i++) {
    	// 检查longestSubstring里有没有当前遍历的那个字符(假设为x)
        if(longestSubstring.includes(s[i])) {
        	// 如果有的话,就把longestSubstring中与当前遍历字符x重复的字符及其之前的所有字符删掉
            longestSubstring.splice(0,longestSubstring.indexOf(s[i]) + 1)
        }
        // 然后再把字符x放入longestSubstring
        longestSubstring.push(s[i]);
        // 同时更新max的值,这里用Math.max()函数也可以
        max = max > longestSubstring.length ? max : longestSubstring.length;
    }
    return max;
};

提交记录
987 / 987 个通过测试用例
状态:通过
执行用时: 88 ms,在所有 JavaScript 提交中击败了98%的用户
内存消耗: 41.5 MB,在所有 JavaScript 提交中击败了70%的用户
时间:202171920:05:22

官方题解

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

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

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

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

【更新结束】

有关参考

更新:2021年7月20日11:18:32

参考:Array.prototype.splice() - JavaScript | MDN
参考:JavaScript splice() 方法
更新:2021年9月2日14:04:11
参考:【微信公众号:三分钟学前端 2021-09-02】每日算法:无重复字符的最长子串

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值