杭州 高端网站定制社群营销的方法和技巧
题目
思路
- 本题采用滑动窗口思想,定义左右指针作为滑动窗口的边界,使用Set数据结构处理重复字符,需要注意的是:每次遍历时采用Math.max方法实时更新最长子串的长度;当左指针移动时,set要删除对应字符。
步骤
- 初始化:定义变量
maxLen
用于记录无重复字符的最长子串的长度,初始值为0
;定义变量left
作为滑动窗口的左边界,初始值为0
;创建一个Set
数据结构charSet
用于存储当前滑动窗口内的字符,利用Set
的元素唯一性来判断字符是否重复。- 遍历字符串:通过
for
循环遍历字符串s
,right
作为滑动窗口的右边界。- 处理重复字符:当发现
charSet
中已经存在当前字符s[right]
时,说明出现了重复字符。此时通过while
循环不断移动滑动窗口的左边界left
,并从charSet
中删除对应的字符,直到窗口内不再有重复字符。- 添加字符并更新长度:将当前字符
s[right]
添加到charSet
中,然后更新maxLen
,取当前maxLen
和当前窗口长度(right - left + 1
)中的较大值。- 返回结果:遍历结束后,
maxLen
即为无重复字符的最长子串的长度,将其返回。
示例代码
var lengthOfLongestSubstring = function(s) {// 用于存储无重复字符的最长子串的长度,初始值为0let maxLen = 0;// 滑动窗口的左边界索引,初始值为0let left = 0;// 使用Set数据结构来存储当前滑动窗口内的字符,Set的特性是元素唯一let charSet = new Set();// 遍历字符串s,right作为滑动窗口的右边界索引for (let right = 0; right < s.length; right++) {// 如果当前字符已经在Set中,说明有重复,需要移动left指针来缩小窗口// 直到窗口内不再有重复字符while (charSet.has(s[right])) {// 从Set中删除滑动窗口左边界对应的字符charSet.delete(s[left]);// 左边界右移一位left++;}// 将当前字符加入Set,此时窗口内无重复字符charSet.add(s[right]);// 更新最长子串的长度,取当前记录的最长长度maxLen和当前窗口长度(right - left + 1)中的较大值maxLen = Math.max(maxLen, right - left + 1);}// 返回无重复字符的最长子串的长度return maxLen;
};
欢迎指正!