LeetCode-热题100:3. 无重复字符的最长子串

news/2024/5/20 9:45:20 标签: leetcode, 算法, golang, 滑动窗口

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

代码及注释

func lengthOfLongestSubstring(s string) int {
    res := 0                      // 初始化最长子串的长度为0
    slow, fast := 0, 0            // 初始化两个指针slow和fast
    m := map[byte]int{}           // 创建一个字典,用于存储字符及其对应的索引

    // 遍历整个字符串
    for fast = 0; fast < len(s); fast++ {
        // 如果当前字符已经在字典中
        if val, ok := m[s[fast]]; ok {
            // 更新slow指针,确保不包含重复字符
            slow = max(slow, val + 1)
        }
        // 更新最长子串的长度
        res = max(res, fast - slow + 1)
        // 更新当前字符的索引
        m[s[fast]] = fast
    }
    return res  // 返回最长子串的长度
}

// 返回两个数中的最大值
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

代码解释:

  1. 初始化

    • res 初始化为0,用于存储最长子串的长度。
    • slowfast 初始化为0,分别用作滑动窗口的起始和结束。
    • m 是一个字典,用于存储字符及其在字符串中的最后一个索引位置。
  2. 遍历字符串

    • fast 指针从0开始,向右移动。
  3. 处理重复字符

    • 如果当前字符 s[fast] 已经在字典 m 中,则更新 slow 指针的位置,使其不包含重复的字符。具体地,slow 被更新为 val + 1,其中 val 是当前字符上次出现的索引。
  4. 更新最长子串的长度

    • 每次迭代后,计算 fast - slow + 1 的长度,并与 res 进行比较,取较大值。
  5. 更新字典

    • 在每次迭代中,将当前字符及其索引添加到字典 m 中。
  6. 返回结果

    • 返回最长子串的长度 res

通过这种滑动窗口的方法,可以找到不包含重复字符的最长子串的长度。


http://www.niftyadmin.cn/n/5449528.html

相关文章

手机IP地址如何更换

手机IP地址的修改方法可以通过以下几种方式实现&#xff1a; 1. 手动更改IP地址&#xff1a;打开手机设置&#xff0c;进入网络设置页面&#xff0c;找到IP地址更改选项。在此页面输入新的IP地址和子网掩码&#xff0c;并启用DHCP服务器。请注意&#xff0c;并非所有手机都支持…

GPT模型部署后续:聊天机器人系统的扩展与优化

一、多轮对话支持 为了实现多轮对话支持&#xff0c;我们需要维护用户的会话上下文。这可以通过在服务器端使用一个字典来存储会话状态实现。 目录 一、多轮对话支持 下面是一个简单的扩展例子&#xff1a; 二、性能优化 三、用户界面与交互优化 下面是一个简单的HTML示例&…

knife4j用法

引入依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.8</version></dependency> <dependency><groupId>io.springfox</groupId&…

初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)

引言 本篇博客是初阶数据结构树的收尾&#xff0c;将会讲掉基本二叉树链式结构的具体内容和实现&#xff0c;包括二叉树的构建&#xff0c;前序遍历&#xff0c;中序遍历&#xff0c;后序遍历和层序遍历&#xff0c;计算二叉树结点个数&#xff0c;第k层结点个数&#xff0c;二…

Python电子邮件自动化基础:从零开始

目录 写在开头1 电子邮件协议简介2 环境搭建3 发送你的第一封邮件3.1 发送邮件的一般步骤3.2 发送QQ邮件 4 接收邮件简介4.1 理解IMAP协议4.2 配置邮件客户端以使用IMAP4.3 Python环境准备4.4 谷歌邮箱收取邮件实例4.5 QQ邮箱读取实例 写在最后 电子邮件已成为我们日常生活和工…

CNN、Transformer、Uniformer之外,我们终于有了更高效的视频理解技术

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 视频理解因大量时空冗余和复杂时空依赖&#xff0c;同时克服两个问题难度巨大…

MySQL学习笔记------SQL(2)

ziduanSQL DML 全称为&#xff1a;Data Manipulation Language&#xff0c;用来对数据库中表的数据记录进行增删改操作 插入数据 添加数据&#xff08;INSERT&#xff09; 给指定字段添加数据&#xff1a;INSERT INTO 表名(字段名1&#xff0c;字段名2&#xff0c;......…

学习Python的第二天

下载工具 PyCharm Community Edition 2023.3.4 下载环境 Python3.10.4 目录 1.初识python 1.1 Python的起源 1.2 为什么学习Python 2.什么是编程语言 2.1 语言的概念 2.2 为什么不使用中文来与计算机交流呢 3.python环境安装 4.第一个python程序 5.python解释器 5…