怎么从无重复字符的最长子串-算法题

原创
小哥 3年前 (2022-10-21) 阅读数 63 #技术教程
文章标签 算法

题目

给定一个字符串 s ,请找出哪一个不包含重复字符 最长子串 的长度。

思路

滑动窗口

  • 如果给定字符长度 小于等于1 ,直接回车长度
  • 创建最大长度变量 max
  • 初始化两个类似指针变量, p1=0 , p2=1 ,则该值等同于索引。
  • 进入while回路 p2 到给定字符的长度,每个循环 p2 后退一点,也就是E。 p2+=1
  • 重复元素的下标是在循环变量中创建的。 sameIndex ,已初始化-1,表示没有重复的元素
  • 遍历 从p1开始到p2所有以前的元素 ,如果有元素 p2 重复,记录复制元素的下标并退出循环。
  • 创建临时最大长度 tempMax
  • 确定是否存在重复元素 (sameIndex >= 0 ?) 的情况
  • 如果存在重复元素,则临时最大长度为 p2-p1 ,在这一点上是 p1 在重复元素后放置一位数字 (p1 = sameIndex+1)
  • 如果没有重复的元素,则临时最大长度为 p2-p1+1
  • 判断 tempMaxmax 的大小max
  • p2 向后移动一个位置后,进入下一个位置。while循环
  • 返回 max

代码

    var lengthOfLongestSubstring = function (s) {
        if (s.length <= 1) {
            return s.length
        }
        // 最大长度
        let max = 0
        // 类似指针1
        let p1 = 0
        // 类似指针2
        let p2 = 1
        while (p2 < s.length) {
            // 为重复元素创建下标 是在循环中初始化的-1 表示无重复
            let sameIndex = -1
            for (let i = p1; i < p2 ; i++) {
                // 遍历寻找p2前面是否有重复的元素
                if (s[i] === s[p2]) {
                    // 记录重复元素的下标。 跳出循环
                    sameIndex = i
                    break
                }
            }
            // 创建临时最大长度
            let tempMax
            if (sameIndex >= 0) {
                // 存在重复的元素
                tempMax = p2 - p1
                p1 = sameIndex + 1
            } else {
                // 没有重复的元素
                tempMax = p2 - p1 + 1
            }
            if (tempMax > max) {
                max = tempMax
            }
            p2 += 1
        }
        return max
    }
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门