小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
题目🦀
-
难度
中等
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = "" 输出: 0
提示:
-
0 <= s.length <= 5 * 104
-
s
由英文字母、数字、符号和空格组成
-
解题思路🌵
-
先找出所有的不包含重复字符的子串
-
找出长度最大那个子串,返回其长度即可
-
用双指针维护一个滑动窗口,用来剪切子串。
-
不断移动右指针,遇到重复字符,就把左指针移动到重复字符的
源码🔥
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
//初始化左指针
let l=0;
//初始化右指针
let res=0;
//这个map用来存放是有有重复的字符
const map=new Map()
//遍历字符,滑动右指针
for (let r=0;r<s.length;r++){
//遇到有重复的字符,并且重复字符是在滑动窗口内,移动左指针
if(map.has(s[r])&&map.get(s[r])>=l){
l=map.get(s[r])+1;
}
// 保存最大值
res=Math.max(res,r-l+1);
map.set(s[r],r);
}
return res;
};
时间复杂度:O(n)
空间复杂度:O(m),m是字符串中不重复字符的个数
结束语🌞
那么鱼鱼的LeetCode算法篇的Leetcode03-无重复字符的最长子串
就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾
,欢迎加我好友
,一起沙雕
,一起进步
。
github🤖:sudongyu
个人博客👨💻:速冻鱼blog
vx👦:sudongyuer
写在最后
伙伴们,如果喜欢我的口水话
给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。