剑指 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(滑动窗口)
这题之前用滑动窗口做过,可以看下面的博客:
我的题解2(双指针(其实也是滑动窗口))
这次我用 i
、j
两个指针来模拟滑动窗口。其大体思路还是一样的。
/**
* @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
更新: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