Open FE92star opened 3 years ago
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
if (!s) {
return 0
}
let arr = s.split('')
let result = 1
let loop = (arr) => {
let resultArr = []
arr.forEach((item, index) => {
if (!resultArr.includes(item)) {
resultArr.push(item)
result = Math.max(result, resultArr.length)
} else {
result = Math.max(result, resultArr.length)
if (index !== arr.length) {
arr.shift()
loop(arr)
} else {
return
}
}
})
}
loop(arr)
return result
};
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
const tempSet = new Set() // 暂存子串的集合
const len = s.length // 字符串总长度
let result = 0 // 结果值
let r = 0 // 右指针
for (let i=0; i<len; i++) { // 逐一以每个字符为起始点计算最长子串
if (i!=0) {// 删除临时子串最左边的,相当于往右移动一位开始重新添加没有重复值的子串
tempSet.delete(s.charAt(i-1))
}
while(r<len && !tempSet.has(s.charAt(r))) {
tempSet.add(s.charAt(r))
r++
}
result = Math.max(result, r-i)
}
return result
};
/**
/**
@param {string} s
@return {number}
*/
var lengthOfLongestSubstring = function(s) {
if (!s) return 0
let i = 0 // 左边界
let j = 1 // 右边界
const strLength = s.length // 字符串的长度
let maxLength = 1 // 计算的最大长度
let subStr = s[0] // 最大长度的字符串
while (j < strLength) {
if (subStr.includes(s[j])) {
// 右边界向右移动的过程中包含重复的字符串,左边界向右移动
const index = subStr.indexOf(s[j]) + 1 // 截取的开始索引
subStr = subStr.slice(index) // 截取不重复的字符串
i = i + index // i向前移动
} else {
maxLength = Math.max(maxLength, j - i + 1) // i-j中间的长度就是最大长度
}
subStr += s[j]
j++
}
return maxLength
}
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var left = 0
// 负位,保证第一位字符能进入判断
var right = -1
var max = 0
var set = new Set()
for (left = 0; left < s.length; left++) {
if (left !== 0) {
// 右移左指针后,移除上一位
set.delete(s[left - 1])
}
// 不停右移右指针
while (right + 1 < s.length) {
if (set.has(s[right + 1])) {
// 如果右指针指向的已存在,退出循环
break
} else {
// 添加右指针指向的字符
set.add(s[right + 1])
right++
}
}
// 检查新的范围长度
max = Math.max(set.size, max)
}
return max
};
leetcode-无重复字符的最长字串