3. 无重复字符的最长子串
3. 无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
(1)滑动窗口 双重循环
想象一个滑动窗口 双指针
var lengthOfLongestSubstring = function(s) {
if(s.length == 0) return 0
let left = 0
let right = 1
let maxLength = 1
while(left < right && right < s.length){
// 在left-right区间内进行比较
for(let cur=left;cur < right;cur++){
// 如果有元素与right相等 就将left放到cur+1
if(s[cur] == s[right]){
left = cur+1
break
}
}
let len = right-left+1
maxLength = Math.max(maxLength, len)
right++
}
return maxLength
};
(2)集合set
利用集合没有重复项的特性
var lengthOfLongestSubstring = function (s) {
let left = 0
let right = 0
let maxLength = 0
let length = 0
let set = new Set()
for (left = 0; left < s.length; left++) {
while (right < s.length) {
if (set.has(s[right])) {
// 如果重复 左指针右移
set.delete(s[left])
break
} else {
set.add(s[right])
right++
}
maxLength = maxLength > (right - left) ? maxLength:right - left
}
}
return maxLength
};
206.反转链表
206. 反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
(1)双指针
只需要一直重复当前指针重新指向前一指针就可以了
var reverseList = function (head) {
if (!head || !head.next) return head
let current = head
let pre = null
let temp = null
while (current) {
temp = current.next // 保存下一节点
current.next = pre
// 往前移动pre和current指针
pre = current
current = temp
}
return pre
};