无题
#栈 #哈希表 #leetcode #JavaScript #字符串 #滑动窗口 #双指针
LeetCode 003:无重复字符的最长子串
题目地址
https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
题目描述
1 | 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 |
解法 滑动窗口+双指针
思路
- 因为需要找无重复的子串,我们可以定义初始化的子串是第一个字符,也就是
let newStr = str[0]
。
- 因为需要找无重复的子串,我们可以定义初始化的子串是第一个字符,也就是
- 然后我们每次往后去加一个字符也就是str[i]。
- 这时候就需要判断str[i]是否在newStr中,并且知道它所在的位置,
let j = newStr.indexOf(str[i]);
。
- 这时候就需要判断str[i]是否在newStr中,并且知道它所在的位置,
- 如果j为-1就是newStr不存在str[i],就是把str[i]的数据加到newStr的后面,
newStr = newStr + str[i]
;否则,从j的位置删除前面的数据后,再加上str[i],newStr = newStr.substring(j+1,newStr.length);newStr = newStr + str[i]
- 如果j为-1就是newStr不存在str[i],就是把str[i]的数据加到newStr的后面,
- 最后将存的最大值和当前的最大值比较。
max = Math.max(max, newStr.length)
- 最后将存的最大值和当前的最大值比较。
- 循环上述操作,从而得出最后的最大值max。
代码一
[[substring和substr的区别]]
使用方法:indexOf + substring + Math.max
1 | /** |
代码二
使用方法:push + splice + indexOf + charAt + Math.max
代码二的逻辑基本与代码一一致,唯一区别在于方法的使用
1 | const lengthOfLongestSubstring = function(s) { |
代码三
使用方法:Map数据结构 + Math.max
代码三的思路也是与代码一一致,优点:indexOf会自带循环获取下标的逻辑,时间上会比Map慢
1 | const lengthOfLongestSubstring = function(s) { |
滑动窗口模板
1 | //外层循环扩展右边界,内层循环扩展左边界 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 易函123!
评论