面试高频算法题---无重复字符的最长子串

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

🤿题目

题目链接:无重复字符的最长字串


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


🕐示例1:


输入:s = abcabcbb

输出:3

解释:abc,bca,bc,b,最长的无重复字符子串的长度为3


🕑示例2:


输入:s = bbbb

输出:1

解释:b为最长的无重复字串子串,长度为1


🕒示例3:


输入:s = pwwkew

输出:3

解释:pw,w,wke,最长无重复字符子串的长度为3


🥅思路解析

我们这里以abcabcbb为例

image.png

从上图中可以发现起始位置递增,结束位置也是递增,于是可以用滑动窗口的思路来解决这个问题,具体做法如下:


🍀1. 我们使用左右两个指针,左指针标记子串起始位置,右指针标记字串结束位置

🍂2. 左指针往右走的时候,我们发现子串会将前一个字符删除

🍀3. 右指针则继续从上一个字串结束的位置往右走

🍂4. 右指针往右遍历的规则是,后续字符在当前字串中不存在,并且右指针往右走的时候不能越界

🍀5. 当右指针满足条件时,将右指针每次遍历的字符都存在HashSet中,因为HashSet方便我们判断子串中是否有将要添加的字符

🍂6. 在左指针每次往右走之前将新的子串与上一个子串的长度进行比较,记录最大值


🏒代码实现

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> m = new HashSet<>();
        //窗口问题
        //如果右边界开始给0,则[left,right),如果边界给-1,则[left,right]
        //这个会影响最后长度的比较  子串长度right-i         字串长度right-i+1
        int right = -1;   //字符串的右边界,刚开始最长字符串中没有字符,故边界给-1
        int size = s.length();   
        int count = 0;   //无重复字符串的长度字符串
        for(int i = 0;i < size;i++){  //i为左边界,依次朝右走
            if(i != 0){
                m.remove(s.charAt(i-1));  //每次左边界右移的时候,需要将前一个字符删除
            }
            //右边界不能越界,且s的下一个字符不在当前子串中
            while(right+1 < size && !m.contains(s.charAt(right+1))){ 
                m.add(s.charAt(right+1));  //向哈希set中添加
                right++;
            }
            count = Math.max(count,right-i+1); //更新长度
        }
        return count;
    }
}


🎿复杂度分析

🍻时间复杂度:左右指针分别遍历了一次字符串,故时间复杂度为O(2N),也就是O(N)


🥂空间复杂度:我们借助了HashSet这一数据结构,里面存储着无重复字符的字符,存储的长度最大为128,因为ASCLL码的范围为[0,128),故空间复杂度为O(M),M为字符的个数,M最大为128  


相关文章
|
10天前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
26 0
|
2月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
2月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
2月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
2月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
6天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
11天前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
23 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
5天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
14天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
35 2
|
1月前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。