leetcode 3. 无重复字符的最长子串

2023-11-10

题目描述

        初始化 ans for 初始化慢指针 = 0, 快指针 = 0 in 可迭代集合 更新窗口内信息 while 窗口内不符合维护的条件 扩展或者收缩窗口 慢指针移动 if 是合法的答案 更新答案 返回 ans 

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

示例 1:

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

示例 2:

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

示例 3:

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

思路一:

看到这道题我首先想到的是用Python的字典,C++的map来实现,先定义一个first指针指向-1,之后挨个遍历字符串,将遍历到的字符记录为Key值,Value为该字符在字符串中的位置,之后当遍历时只要有重复字符出现时,也就意味着相同的Key值要进入字典,此时将最先记录Key值的字符的Value值赋给first指针,就此时的状态而言,最长无重复子串=该字符在字符串中的位置-first指针所指的值(也就是该字符上一次在字符串中出现的位置),当每次字符串向后遍历一位时,都记录最长无重复子串的最大值,以此类推对最大值进行更新,求出最长无重复字符子串。

C++:

#include <unordered_map>
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char,int> d;//无序map
        int first = -1,max = 0,n=s.size();
        for(int i=0;i<n;i++)
        {
            if (d.find(s[i])!=d.end() && d[s[i]]>first)//s[i]在map中存在且在字符串中的位置大于first指针
            {
                first= d[s[i]];//将原先该字符的value值赋给first指针
                d[s[i]] = i;//更新该字符现在的value值
            }
            else
                d[s[i]]= i;
                if (i-first >=max)
                {
                    max = i-first;
                }
        }

        return max;
    }
};

Python:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        first = -1
        max = 0 
        d = {}

        for i in range(len(s)):
            if s[i] in d and d[s[i]]>first:
                first = d[s[i]]
                d[s[i]] = i 
            else:
                d[s[i]] = i
                if  i - first >= max:
                    max = i -first
        return max

思路二(leetcode官方给的解法):滑动窗口(其实也是用了双指针)

大概意思是:始终保证左右指针之间的字符串为无重复子串,遍历字符串统计出最长的无重复子串

        难想的是左指针向右移动的时机,官方给的题解很巧妙,在每次大循环时,都会将左指针向右移动一格,那么问题的关键就变成了右指针停止的条件,即左指针所指的字符重复出现的时机。在什么情况下能直接判断出字符是否重复出现呢,对,是set容器!我们只要将每个统计过的字符加入了set容器,那么当set容器中存在的值再次出现时,我们便知道此时右指针该停止移动了,该左指针移动!

        所以便能写出关键代码:

 while (rk + 1 < n && !occ.count(s[r + 1])) {
                // 不断地移动右指针
                occ.insert(s[r + 1]);
                ++rk;
            }

从而写出完整代码:

C++

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> occ;//建立无序set容器
        int n=s.size();
        int r=-1;
        int ans =0;
        for (int i=0;i<n;i++)
        {
            if (i!=0){//将最左边元素出集合
              occ.erase(s[i-1]);  
            }
            while(r+1<n && !occ.count(s[r+1]))//右指针继续遍历条件
            {
                occ.insert(s[r+1]);//集合中加入右指针所指字符
                r++;
            }
            ans = max(ans,r-i+1);
        }
        return ans;
    }
};

Python:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        occ = set()
        n = len(s)
        r, ans = -1, 0
        for i in range(n):
            if i != 0:
                occ.remove(s[i - 1])
            while r + 1 < n and s[r + 1] not in occ:
                occ.add(s[r + 1])
                r += 1
            # 第 i 到 r 个字符是一个极长的无重复字符子串
            ans = max(ans, r - i + 1)
        return ans

总结:

        这道题只要理解了思路,不是很难做,难在思路和一些地方具体代码的实现。双指针在做数组,字符串,链表等问题时使用频率很高,需要熟练掌握。

涉及知识:双指针

                C++ :map容器, set容器

                Python: 字典 ,set()函数

相关问题可在我的专栏中查看:

双指针_小梁今天敲代码了吗的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode 3. 无重复字符的最长子串 的相关文章

随机推荐

  • python编写用户登录程序_python初学之用户登录的实现过程(实例讲解)

    要求编写登录接口 1 输入用户名和密码 2 认证成功后显示欢迎信息 3 用户名输错 提示用户不存在 重新输入 5次错误 提示尝试次数过多 退出程序 4 用户名正确 密码错误 提示密码错误 重新输入 密码错误3次 锁定用户名并提示 退出程序
  • python 字符串替换

    在Python中 字符串是一种非常重要的数据类型 它可以用来表示文本 数字 符号等信息 在实际开发中 我们经常需要对字符串进行替换操作 这时就需要用到字符串替换函数 Python中的字符串替换函数主要有replace translate r
  • 30岁后程序员的出路[转]

    那程序员到了30岁 怎样提高自己的不可替代性呢 我们打算做一辈子程序员吗 敢问路在何方 作为一个过来人 一个资深程序员 我觉得有几个方向可以选择 1 成为技术大拿 其实 做一辈子程序员并没有什么问题 重要的是 你必须成为一个不可替代的程序员
  • 在字节跳动做了6年软件测试,4月无情被辞,想给划水的兄弟提个醒

    先简单交代一下背景吧 某不知名 985 的本硕 17 年毕业加入字节 以 人员优化 的名义无情被裁员 之后跳槽到了有赞 一直从事软件测试的工作 之前没有实习经历 算是6年的工作经验吧 这6年之间完成了一次晋升 换了一家公司 有过开心满足的时
  • [JavaScript] async/await面试题 及其解析

    题目 async function async1 console log 1 await async2 console log 2 async function async2 console log 3 console log 4 setT
  • iframe简单使用 、获取iframe 、获取iframe 元素值 、iframe获取父页面的信息

    文章目录 1 iframe简单使用 2 获取iframe 3 获取iframe 元素值 4 iframe获取父页面的信息 1 iframe简单使用 标签规定一个内联框架 一个内联框架被用来在当前 HTML 文档中嵌入另一个文档 width插
  • 图像分类、目标检测、语义分割、实例分割和全景分割的区别

    1 Image Classification 图像分类 图像分类 下图左 就是对图像判断出所属的分类 比如在学习分类中数据集有人 person 羊 sheep 狗 dog 和猫 cat 四种 图像分类要求给定一个图片输出图片里含有哪些分类
  • ISTQB认证工程师学习笔记(4)——测试技术

    测试技术一般可分为黑盒测试 白盒测试 基于经验的测试技术 黑盒测试 黑盒测试技术 也称为行为的或基于行为的技术 基于对适当测试依据的分析 例如 正式需求文档 规格说明 用例 用户故事或业务流程 这些技术适用于功能和非功能测试 黑盒测试技术关
  • verilog 中的 log2

    对数的作用 log2是指2的对数 对于二进制的计算机系统来说非常有用 比如 10bits的地址线 可寻址的地址空间为2 10 那么反过来对于1024深的地址空间 需要多少bits的地址线 需要用log2 depth 来计算 如何求对数 sy
  • 爬取中国移动用户问答

    最近一个好朋友在搞爬虫 问了很多问题 所以干脆直接写了一个范例 这个程序整体要两次解析网页 第一层是分析网页中的json数据来获取qtid 第二层是用qtid来解析获得问答所在的网页 因为在问答网页里的数据存储是引用的数据库中的数据 所以不
  • Mac系统下algs4学习环境搭建

    InterliJ下的搭建 1 官网下载algs4 rar文件 拷贝到在新建项目的libs文件夹下 然后在File gt project Structure 需要用到啦gs4的模块中导入jar包 这样在程序中引用静态类就不会报错类 termi
  • 深入Java(二):Java中的强引用、软引用、弱引用、幻像引用( 虚引用)

    在Java语言中 除了基本数据类型外 其他的都是指向各类对象的对象引用 Java中根据其生命周期的长短 将引用分为4类 1 强引用 特点 我们平常典型编码Object obj new Object 中的obj就是强引用 通过关键字new创建
  • 【python】20行代码实现有道翻译api接口调用

    文章目录 1 目标站点 2 完整代码 3 测试样例 3 1 测试样例 汉译英 3 2 测试样例 英译汉 4 调用文档 4 1 接口地址 4 2 请求方法 4 3 请求参数 4 4 请求示例 4 5 成功响应 5 接口分析 6 相关推荐 1
  • GDB下查看内存命令(x命令)

    GDB下查看内存命令 x命令 你可以使用examine命令 简写是x 来查看内存地址中的值 x命令的语法如下所示 x
  • 计算机软件摊销会计分录,财务软件摊销会计分录怎么写?

    摘要 这是一篇关于财务软件摊销会计分录怎么写 的文章 在财务软件摊销会计分录怎么写 文章中给各位财务人员讲解的是有关财务软件摊销会计分录怎么写 的会计实务处理 财务软件摊销会计分录怎么写 外帐按规定财务软件应该按无形资产处理10年摊销 或跟
  • vcruntime140.dll无法继续执行代码?vcruntime140.dll如何修复?只需要3步即可

    vcruntime140 dll是用于Microsoft Visual C Redistributable 可再发行组件 的一部分 它是一个动态链接库文件 包含了该软件包提供的运行库 在许多应用程序和游戏中 vcruntime140 dll
  • 深入理解Java中的BigInteger和 BigDecimal,再也不怕面试了

    Integer类作为int的包装类 能存储的最大整型值为2 31 1 Long类最大为2 63 1 虽然比Integer类大了很多 但是也是有限的 如果想要表示更大的整数 不管是基本数据类型还是它们对应的包装类都无法实现 Java中提供了两
  • 20221102模型调用 报错invalid load key, ‘\x00‘.invalid load key, ‘\x10‘.

    一 模型保存和调用 保存方法不一样 调用方法也不一样 joblib import joblib 保存 joblib dump model model1 pkl 加载 model joblib load open model1 pkl rb
  • 深拷贝构造函数和浅拷贝构造函数

    深拷贝构造函数和浅拷贝构造函数 拷贝构造函数有深拷贝构造函数和浅拷贝构造函数 分类 拷贝构造函数分为深拷贝构造函数和浅拷贝构造函数 区别 浅拷贝 即只复制对象空间 不复制对象资源 深拷贝 既复制对象空间又复制资源 由C 语言提供的默认拷贝构
  • leetcode 3. 无重复字符的最长子串

    题目描述 初始化 ans for 初始化慢指针 0 快指针 0 in 可迭代集合 更新窗口内信息 while 窗口内不符合维护的条件 扩展或者收缩窗口 慢指针移动 if 是合法的答案 更新答案 返回 ans 给定一个字符串 s 请你找出其中