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%的用户
时间:2021年7月19日20:05:22
官方题解
更新:2021年7月29日18:43:21
因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。
更新:2021年7月29日20:03:26
【更新结束】
有关参考
更新:2021年7月20日11:18:32
参考:Array.prototype.splice() - JavaScript | MDN
参考:JavaScript splice() 方法
更新:2021年9月2日14:04:11
参考:【微信公众号:三分钟学前端 2021-09-02】每日算法:无重复字符的最长子串