minjs1cn / weekly-learning

每周学习分享打卡
0 stars 0 forks source link

16 -【leetcode】无重复字符的最长字串 #16

Open FE92star opened 3 years ago

FE92star commented 3 years ago

leetcode-无重复字符的最长字串

Brand0n-Zhang commented 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
};
wucuiping commented 3 years ago
/**
 * @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
};
FE92star commented 3 years ago

/**

asdzxc01 commented 3 years ago
/**

@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
      }
OceanApart commented 3 years ago
/**
 * @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
};