面试热题(无重复字符的最长子串)

news2024/12/25 7:40:31

无重复字符的最长子串

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

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

解法一:

    public int lengthOfLongestSubstring(String s) {
      if(s==null){
          return 0;
      }
      int max=0;
      //因为s中包含数字、英文、符号,所以设置长度为128
      int[] hash=new int[128];
      //右指针
      int right=0;
      //左指针
      int left=0;
      //while条件right<s.length()
      while(right<s.length()){
            int c=s.charAt(right++);
            //hash数组对应的位置+1
            hash[c]++;
            //说明left~right+1中有重复字符
            while(hash[c]>1){
                hash[s.charAt(left++)]--;
            }
          max=Math.max(max,right-left);
      }
      return max;
    }

  •  对入参进行判断,排除一些不合法的条件
  • 设置同向指针,left、right(相当于是两个前后指针)
  • right不断的向后走,记录中途的字符,用hash表进行统计,如果统计时发现hash[i]>1,就说明当前字符在之前已经出现过
  • left向后走,找到重复的元素位置上,然后移动到重复字符第一次出现的索引index +1的位置上,这时候计算max的值(最大长度)

解法二:

     public int lengthOfLongestSubstring(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        int left=0;
        int max=0;
        //将字符串转换为char
        char[] str=s.toCharArray();
        int[] hash=new int[128];
        for(int right=0;right<s.length();right++){
            char c=str[right];
            hash[c]++;
            while(hash[c]>1){
                hash[str[left++]]--;
            }
            int val=right-left+1;
            max=Math.max(val,max);
        }
        return max;
    } 

大体过程如上题所示

解法三:

 public int lengthOfLongestSubstring(String s) {
             //创建一个map数组,值对应键值,然后两个索引,加一个最大值的子串长度
        //入参进行判断
        if(s.length()==0){
            return 0;
        }
        //创建一个map数组用于存放输出的单个字符-索引
        Map<Character, Integer> arr=new HashMap<>();
        //定义两个指针
        int i=0;
        int j=0;
        //定义最大的长度变量
        int max=0;
        //对字符串进行循环遍历
        for ( i = 0; i <s.length() ; i++) {
            //将对应索引的字符赋给变量key
            char key=s.charAt(i);
            //输出一个字符之后要和map中的数组进行比较,如果没有包含,直接加入到map数组中去,
            //如果有,则将j指针移到对应的i位置上去,再进行遍历
            if(arr.containsKey(key)){
                j=Math.max(arr.get(key),j);
            }
                //保存最大长度
                max=Math.max(max,i-j+1);
                //不断地往数组中加字符
                arr.put(s.charAt(i),i+1);
            
        }
        return max;
    }

     

  •  对入参进行判断
  • 创建一个hash表,记录索引的位置
  • 定义同向指针
  • 遍历右指针,收缩左指针
  • 每次遍历一个字符将字符添加到hash表中,并添加对应的索引
  • 输出一个字符之后和map中的key进行比较,如果没有包含,直接加到hash表中去
  • 如果有,则收缩左指针,再次进行遍历
  • 保存最大长度(左闭右闭)
  • 每次添加元素索引的时候添加对应元素的idnex+1,符合左闭的条件

      这时候肯定有人想问我,为什么在计算这类长度的时候,有的时候是s=right-left,而有的时候是s=right-left+1呢?这得看你自己定义的是左闭右开还是左闭右闭,有些人每次的糊里糊涂的做题,过了就没有再仔细深究,其实这与你的循环有着莫大的关系,仔细的同学已经发现我第一种解法用的是right-left,可是第二种解法就是用的right-left+1,接下来给大家揭秘这种应该怎么去选择

第一种方法:

 while(right<s.length()){
    int c=s.charAt(right++);
     ...
}

假如我们right已经到达了s.length-1的位置上,是不是进来还得做一次right++的操作

       由上图我们可以清楚的看到right取到了比我们s长度还要大的位置上,这种情况就是右开,所以长度就是right-left  

第二种方法:

for(int right=0;right<s.length();right++){
            char c=str[right];
          
        }

       假如我们right已经到达了s.length-1的位置上,进来也没有对right进行任何操作,所以最后right索引是停在b这个位置上

       由上图我们可以清楚的看到right取到了比我们s长度还要大的位置上,这种情况就是右闭,所以长度就是right-left+1  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4/5 PoseDriver 动画蓝图节点使用

PoseDriver节点可以进行Pose的比对&#xff0c;从而针对不同Pose生成不同权重数值&#xff0c;权重数值可应用至MorphTarget上使动画更加逼真&#xff0c;或应用至角色挂件上&#xff0c;制作出类惯性或弹簧的附加效果。 1.创建Pose 这里创建Box作为演示&#xff0c;下图大Bo…

【更新】119所院校考研重点勾画更新预告!

截至目前&#xff0c;我已经发布了47篇不同院校的择校分析。发布了87套名校信号考研真题以及119所不同院校的考研知识点重点勾画。 另外为了更好服务已经报名的同学&#xff0c;24梦马全程班也到了收尾的阶段。即将封班&#xff01;需要报名的同学抓紧啦&#xff01; 去年开始…

4-百度地图

4-百度地图 一 百度地图 1 前期准备 H5端和PC端,对接百度提供JavaScript API。 移动端,对接百度android SDK或ios SDK (1)打开百度地图开放平台 地址:https://lbsyun.baidu.com/ (2)选中开发文档——JavaScript Api 按照文档步骤开通百度开放平台并申请密钥 2 展示地…

Mysql5.8 Windows安装

1、下载安装包 MySQL :: Download MySQL Community Server 下载后解压到某个文件夹 2、配置环境变量 3.创建my.ini文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirE:\\software\\mysql\\mysql-8.0.11-winx64 # 切记此处一定要用双斜杠\\&#xff0c;…

小白到运维工程师自学之路 第六十三集 (dockerfile安装sshd、httpd、nginx)

一、概述 Dockerfile的指令根据作用可以分为两种&#xff0c;构建指令和设置指令。构建指令用于构建image&#xff0c;其指定的操作不会在运行image的容器上执行&#xff1b;设置指令用于设置image的属性&#xff0c;其指定的操作将在运行image的容器中执行。 1、FROM 镜像:T…

Profinet转Modbus RTU从站模式的配置流程

兴达易控Profinet转Modbus RTU从站模式的配置流程需要按照以下步骤进行。首先&#xff0c;确保Profinet主站和Modbus RTU从站的设备之间有正确的连接&#xff0c;包括电气连接和网络连接。然后&#xff0c;在Profinet主站上设置适当的通信参数。 下面是具体操作&#xff1a;创…

electron+vue+ts窗口间通信

文章目录 一. 目的二.逻辑分析三. 代码示例 "types/node": "^20.3.1","vitejs/plugin-vue": "^4.1.0","vueuse/electron": "^10.2.1","electron": "^25.2.0","electron-packager":…

python基础2——数据类型

文章目录 一、字符串处理1.1 占位符1.2 拼接符1.3 统计字符串长度1.4 切片取值1.5 内置字符串处理方法 二、组合数据类型2.1 列表2.2 元组2.3 集合2.4 字典 三、数据类型转换 一、字符串处理 1.1 占位符 可以使用%s占位符在字符串中引用变量。 1.有两种写法。 name "qi…

Git笔记--Ubuntu上传本地项目到github

目录 1--基本配置 2--本地上传 1--基本配置 ① 创建ssh-key cd ~/.sshssh-keygen -t rsa -C "邮箱地址"② 查看并关联ssh-key gedit id_rsa.pub 复制内容&#xff0c;在 GitHub 中依次点击 Settings -> SSH and GPG keys -> New SSH key&#xff0c;将 id…

iperf3

iperf3输出的参数的信息 interval 发送一次数据的间隔 transfer 传输速率 kBytes s---秒 Bitrate bit比特。rate速率。bitrate比特率。比特率是指信息传播的速率。 Retr retry---重传 链接 cwnd 拥塞串口大小 jitter 抖动时间 lost/total lost--丢失的包 tot…

C++ 结构体和联合体

1.结构体 结构体是一种特殊形态的类&#xff0c;它和类一样&#xff0c;可以有自己的数据成员和函数成员&#xff0c;可以有自己的构造函数和析构函数&#xff0c;可以控制访问权限&#xff0c;可以继承&#xff0c;支持包含多态&#xff0c;结构体定义的语法和类的定义语法几…

10.VS2022打包应用程序成安装包

VS2022利用Microsoft Visual Studio Installer Projects打包应用程序,生成安装包 1.安装Microsoft Visual Studio Installer Projects 1.1 打开扩展搜索Microsoft Visual Studio Installer Projects安装 1.2 安装完之后需要重启启动一下VS 2.创建安装项目 2.1 解决方案-》…

修改文件格式(查看文件拓展名)

很多时候我们直接把txt文件重命名为xxx.c或者别的文件格式&#xff0c;文件类型依然会是txt&#xff0c;文件名并不会变成我们想要的xxx.c&#xff0c;而是xxx.c.txt&#xff0c;也就是下面这个样子 给大家介绍2种方法去解决这个问题 目录 1.另存为新格式 2.显示文件拓展名 1…

【网络编程】五种网络IO模式

对于一次IO访问&#xff08;以read为例&#xff09;&#xff0c;数据会先被拷贝到操作系统内核的缓冲区中&#xff0c;然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说&#xff0c;当一个read操作发生时&#xff0c;会经历两个阶段&#xff1a; 1、等待数据准…

解决一个Sqoop抽数慢的问题,yarn的ATSv2嵌入式HBASE崩溃引起

新搭建的一个Hadoop环境&#xff0c;用Sqoop批量抽数的时候发现特别慢&#xff0c;我们正常情况下是一个表一分钟左右&#xff0c;批量抽十几个表&#xff0c;也就是10分钟的样子&#xff0c;结果发现用了2个小时&#xff1a; 查看yarn日志 发现有如下情况&#xff1a; 主要有两…

SIFT算法原理:SIFT算法详细介绍

前面我们介绍了Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。…

【MYSQL】数据库那些操作

update&#xff1a;使用非索引字段time查询报错 解决方案&#xff1a;加上limit的限制&#xff0c;以免全表操作 例&#xff1a;update tableName set rt_no ‘123456’ where update_time between ‘2023-06-30 00:00:00’ and ‘2023-07-01 00:00:00’ limit 10;concat&#…

抄写Linux源码(Day6:读闪客文章第一回 “最开始的两行代码”)

按照 Day1 完成了 Linux0.11 的运行之后&#xff0c;可以在 ~/oslab/linux-0.11 找到 linux0.11 的源码 根据闪客的文章第一回&#xff1a;https://mp.weixin.qq.com/s/LIsqRX51W7d_yw-HN-s2DA Linux0.11 的启动代码程序入点在 bootsect.s 里&#xff0c;总共 512 个字节 这…

常见自动化测试工具集合

1、Appium -------> AppUI自动化测试 官网&#xff1a;http://appium.io Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台&#xff0c;支持Python、Java 等语言&#xff0c;即同一套Java 或Python 脚本可以同时运…

IO进程线程day5(2023.8.2)

一、Xmind整理&#xff1a; 父进程会拷贝文件描述符表给子进程&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;①从终端获取一个文件的路径以及名字。②若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹③若该文…