大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~
题目🦀
- 3. 无重复字符的最长子串难度
中等
给定一个字符串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-无重复字符的最长子串
就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾
,欢迎加我好友
,一起沙雕
,一起进步
。