Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
-
<= s.length <= s由英文字母、数字、符号和空格组成
思路分析
- 边界值判定,字符串长度小于等于1时,返回字符串的长度;
- 定义结果值 res = 1;
- 从头开始循环,找到以当个字符为起始点的最长子串。方法一,使用字符串来存储子串,方法二使用map来存储。
AC 代码
方法一
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if (s.length <= 1) return s.length
let res = 1
for(let i = 0; i < s.length; i++) {
let str = s[i]
for(let j = i + 1; j < s.length; j++) {
if(str.indexOf(s[j]) === -1) {
str += s[j]
res = Math.max(res, j - i + 1)
} else {
break
}
}
}
return res
};
结果:
- 执行结果: 通过
- 执行用时:192 ms, 在所有 JavaScript 提交中击败了17.70%的用户
- 内存消耗:47.8 MB, 在所有 JavaScript 提交中击败了11.73%的用户
- 通过测试用例:987 / 987
方法二
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if (s.length <= 1) return s.length
let res = 1
for(let i = 0; i < s.length; i++) {
let map = new Map()
map.set(s[i], 1)
for (let j = i + 1; j < s.length; j++) {
if (!map.has(s[j])) {
map.set(s[j], 1)
res = Math.max(res, j - i + 1)
} else {
break
}
}
}
return res
};
结果:
- 执行结果: 通过
- 执行用时:240 ms, 在所有 JavaScript 提交中击败了13.89%的用户
- 内存消耗:47.8 MB, 在所有 JavaScript 提交中击败了12.90%的用户
- 通过测试用例:987 / 987