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

无重复字符的最长子串

给定一个字符串 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  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css 动画之旋转视差

序&#xff1a;网上看到的一个例子&#xff0c;做一下 效果图&#xff1a; 代码&#xff1a; <style>.content{width: 300px;height: 300px;margin: 139px auto;display: grid;grid-template-columns: repeat(3,1fr);grid-template-rows: repeat(3,1fr);grid-template:…

4年测试工程师,常用功能测试点总结,“我“不再走弯路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 输入框测试 1、字…

MySQL的JSON操作

官网地址 1. MySQL json介绍 As of MySQL 5.7.8, MySQL supports a native JSON data type defined by RFC 7159 that enables efficient access to data in JSON (JavaScript Object Notation) documents. Automatic validation of JSON documents stored in JSON columns. …

【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示&#xff1a;这个命令对网络有要求&#xff0c;可能需要翻墙或者用你的手机热点试试&#xff0c;或者把DNS换成&#xff08;114.114.114.114 和 8.8.8.8&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

【【胎教级51单片机智能小车设计】】

胎教级51单片机智能小车设计 从现在开始开一个新坑 称为创意工坊 主要更新一些有意思的设计 第一次手把手更新51单片机智能小车 胎教级教学人人都会 单片机实现的功能是通过蓝牙APP 控制小车前后左右移动 先讲明白这个小车 后续再在这个小车上更新其他的设计 成品图 第一步…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离(一)

说明&#xff1a;请先自行安装好docker再来看本篇文章&#xff0c;本篇文章主要实现通过使用docker部署mysql实现读写分离&#xff0c;并连接数据库测试。第二篇将实现使用Shardingjdbc实现springboot的读写分离实现。 基于Docker去创建Mysql的主从架构 #创建主从数据库文件夹…

Rocky(centos) jar 注册成服务,能开机自启动

概述 涉及&#xff1a;1&#xff09;sh 无法直接运行java命令&#xff0c;可以软连&#xff0c;此处是直接路径 2&#xff09;sh脚本报一堆空格换行错误&#xff1a;需将转成unix标准格式&#xff1b; #切换到上传的脚本路径 dos2unix 脚本文件名.sh 2&#xff09;SELINUX …

如何使用STAR原则优化项目管理?

介绍STAR原则 1.1 STAR原则的定义 STAR原则是一个行为面试技术&#xff0c;即Situation&#xff08;情境&#xff09;、Task&#xff08;任务&#xff09;、Action&#xff08;行动&#xff09;和Result&#xff08;结果&#xff09;。这种原则被广泛应用在职业面试中&#x…

PROFINet转Modbus协议转换网关Profinet数据通讯模块

产品概述 你是否曾经遇到过不同网络协议之间的沟通问题&#xff1f;捷米特JM-RTU-PN为你解决这个难题&#xff01; 捷米特JM-RTU-PN是一款数据通讯模块&#xff0c;能够实现PROFINet网络与Modbus网络之间的数据传输。它可以将RS485网络连接到PROFINet网络&#xff0c;并支持不…

【iOS】—— UIKit相关问题

文章目录 UIKit常用的UIKit组件懒加载的优势 CALayer和UIView区别关系 UITableViewUITableView遵循的两个delegate以及必须实现的方法上述四个必须实现方法执行顺序其他方法的执行顺序&#xff1a; UICollectionView和UITableView的区别UICollectionViewFlowLayout和UICollecti…

mysql进阶-用户的创建_修改_删除

1. 使用mysql单次查询 [rootVM-4-6-centos /]# mysql -h localhost -P 3306 -p mytest -e "select * from book1"; Enter password: ------------------------------------------- | id | category_id | book_name | num | ----------------------------…

第七章 图论

第七章 图论 一、数据结构定义 图的邻接矩阵存储法#define MaxVertexNum 100 // 节点数目的最大值// 无边权&#xff0c;只用0或1表示边是否存在 bool graph[MaxVertexNum][MaxVertexNum];// 有边权 int graph[MaxVertexNum][MaxVertexNum];图的邻接表存储法 把所有节点存储为…

Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单 em

&#xfeff; Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&…

UNITY随记(八) SHADER实现立方体CUBE显示边框,描边

Shader "Vitens/CubeOutline"{Properties{_Color("Color", color) (1,1,1,1)_Width("Width", range(0,0.5)) 0.1}SubShader{Tags { "Queue""Transparent" }Pass {//如果要显示背面的线框&#xff0c;取消下面两个注释即可…

【etcd】docker 启动单点 etcd

etcd: v3.5.9 etcd-browser: rustyx/etcdv3-browser:latest 本文档主要描述用 docker 部署单点的 etcd&#xff0c; 用 etcd-browser 来查看注册到 etcd 的 key 默认配置启动 docker run -d --name ai-etcd --networkhost --restart always \-v $PWD/etcd.conf.yml:/opt/bitn…

Redis系列二:Clion+MAC+Redis环境搭建

1. ClionMACRedis-3.0-annotated环境搭建 参考&#xff1a; https://github.com/huangz1990/redis-3.0-annotated https://gitee.com/dumpcao/redis-3.0-annotated-cmake-in-clion https://tool.4xseo.com/a/12910.html 1.1 下载并导入Clion git clone https://gitee.com/dum…

LabVIEW开发多材料摩擦电测量控制系统

LabVIEW开发多材料摩擦电测量控制系统 摩擦电效应是两个物体摩擦在一起&#xff0c;电荷从一个物体转移到另一个物体的现象&#xff0c;从而导致两个物体携带相等和相反的电荷。接触和充电是主导该过程的两个关键因素。当静电荷累积到一定水平时&#xff0c;可能会出现放电现象…

Netty自定义消息协议的实现逻辑处理粘包拆包、心跳机制

Netty 自定义消息协议的实现逻辑自定义编码器 心跳机制实现客户端发送心跳包 自定义消息协议的实现逻辑 消息协议&#xff1a;这一次消息需要包含两个部分&#xff0c;即消息长度和消息内容本身。 自定义消息编码器︰消息编码器将客户端发送的消息转换成遵守消息协议的消息&…

关于latch up的重读

衬底电流容易导致寄生三极管导通(衬底电阻衬底电流》衬底压差)&#xff0c;更容易触发latchup&#xff1b; 一般常用的实际产品中会用衬底隔离的器件来做负压器件&#xff1b;用DNW&NBL组成一个隔离盆将整个负压区和正常电路分开&#xff0c;DNW&NBL接高电压&#xff1…