力扣 3.无重复字符的最长子串——Java

题目要求:

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

题解:

import java.util.Arrays;class Solution {public int lengthOfLongestSubstring(String s) {// 检查字符串是否为空或长度为0if (s == null || s.length() == 0) {return 0; // 如果是空字符串,返回0}// 将字符串转换为字符数组char[] arr = s.toCharArray();// 用于记录每个字符出现次数的数组int[] n = new int[1000]; // 假设字符集的大小足够大int result = 0; // 记录最长无重复字符子串的长度int j = 0; // 滑动窗口的起始位置// 遍历字符数组for (int i = 0; i < arr.length; i++) {n[arr[i]]++; // 记录当前字符的出现次数// 如果当前字符出现次数超过1,表示有重复字符while (n[arr[i]] > 1) {n[arr[j]]--; // 减少起始字符的计数j++; // 移动起始位置以排除重复字符}// 更新最长无重复字符子串的长度result = Math.max(result, i - j + 1);}return result; // 返回最长无重复字符子串的长度}
}

代码解释

  1. 空字符串检查

    if (s == null || s.length() == 0) {return 0;
    }
    
    • 如果输入字符串 s 为空或长度为 0,直接返回 0,因为没有可处理的字符。
  2. 字符串转化为字符数组

    char[] arr = s.toCharArray();
    
    • 将字符串 s 转换为字符数组 arr,以便于后续处理。
  3. 字符计数数组

    int[] n = new int[1000];
    
    • 创建一个整型数组 n 用于记录每个字符的出现次数。这里假设字符集的大小足够大(如 ASCII 字符集)。
  4. 初始化变量

    int result = 0; // 最长无重复子串的长度
    int j = 0; // 滑动窗口的起始位置
    
  5. 遍历字符数组

    for (int i = 0; i < arr.length; i++) {n[arr[i]]++; // 记录当前字符的出现次数
    
    • 使用 for 循环遍历字符数组 arr,并增加当前字符的计数。
  6. 处理重复字符

    while (n[arr[i]] > 1) {n[arr[j]]--; // 减少起始字符的计数j++; // 移动起始位置以排除重复字符
    }
    
    • 如果当前字符的计数大于 1,说明出现了重复字符,则进入 while 循环,减少 arr[j] 的计数,并移动 j,以确保窗口内的字符都是唯一的。
  7. 更新最长无重复子串长度

    result = Math.max(result, i - j + 1);
    
    • 计算当前无重复子串的长度(i - j + 1),并更新 result,保持记录最长的长度。
  8. 返回结果

    return result;
    
    • 方法结束时返回最长无重复字符子串的长度 result
注意事项
  • 数组越界:在 for 循环中,arr.length() 应为 arr.length,因为 arr 是字符数组,不是字符串。
  • 字符集大小int[] n = new int[1000]; 假设字符集足够大,实际上对于 ASCII 字符集,可以使用 int[128]int[256] 来节省空间。

示例输入

假设我们的输入字符串是:

s = "abcabcbb"
初始化
  1. 字符数组转换

    char[] arr = s.toCharArray(); // arr = ['a', 'b', 'c', 'a', 'b', 'c', 'b', 'b']
    
  2. 字符计数数组

    int[] n = new int[1000]; // 用于记录字符出现次数
    
  3. 初始化变量

    int result = 0; // 最长无重复子串长度
    int j = 0; // 滑动窗口的起始位置
    
遍历字符数组

我们将逐步遍历字符数组 arr,并记录字符出现的次数,同时更新最长无重复子串的长度。

过程演示
  1. i = 0,字符 arr[0] = 'a'

    • n['a']++ -> n['a'] = 1
    • result = Math.max(result, 0 - 0 + 1) = 1 (当前子串 “a”)
  2. i = 1,字符 arr[1] = 'b'

    • n['b']++ -> n['b'] = 1
    • result = Math.max(result, 1 - 0 + 1) = 2 (当前子串 “ab”)
  3. i = 2,字符 arr[2] = 'c'

    • n['c']++ -> n['c'] = 1
    • result = Math.max(result, 2 - 0 + 1) = 3 (当前子串 “abc”)
  4. i = 3,字符 arr[3] = 'a'

    • n['a']++ -> n['a'] = 2 (出现重复)
    • 进入 while循环,n[‘a’] > 1:
      • 第一次循环:
        • n['a']-- -> n['a'] = 1
        • j++ -> j = 1 (窗口变为 “bc”)
      • 第二次检查 while 条件:n['a'] > 1 不成立,跳出循环。
    • result = Math.max(result, 3 - 1 + 1) = 3 (当前子串 “abc”)
  5. i = 4,字符 arr[4] = 'b'

    • n['b']++ -> n['b'] = 2 (出现重复)
    • 进入 while循环,n[‘b’] > 1:
      • 第一次循环:
        • n['b']-- -> n['b'] = 1
        • j++ -> j = 2 (窗口变为 “c”)
      • 第二次检查 while 条件:n['b'] > 1 不成立,跳出循环。
    • result = Math.max(result, 4 - 2 + 1) = 3 (当前子串 “abc”)
  6. i = 5,字符 arr[5] = 'c'

    • n['c']++ -> n['c'] = 2 (出现重复)
    • 进入 while循环,n[‘c’] > 1:
      • 第一次循环:
        • n['c']-- -> n['c'] = 1
        • j++ -> j = 3 (窗口变为 “a”)
      • 第二次检查 while 条件:n['c'] > 1 不成立,跳出循环。
    • result = Math.max(result, 5 - 3 + 1) = 3 (当前子串 “abc”)
  7. i = 6,字符 arr[6] = 'b'

    • n['b']++ -> n['b'] = 2 (出现重复)

    • 进入 while循环,n[‘b’] > 1

      • 第一次循环:
        • n['a']-- -> n['a'] = 0
        • j++ -> j = 4 (窗口变为 “b”)
      • 第二次检查 while 条件:n['b'] > 1 不成立,跳出循环。
    • result = Math.max(result, 6 - 4 + 1) = 3 (当前子串 “bc”)

  8. i = 7,字符 arr[7] = 'b'

    • n['b']++ -> n['b'] = 3 (出现重复)
    • 进入 while循环,n[‘b’] > 1:
      • 第一次循环:
        • n['b']-- -> n['b'] = 2
        • j++ -> j = 5 (窗口变为 “c”)
      • 第二次检查 while 条件:n['b'] > 1 不成立,跳出循环。
    • result = Math.max(result, 7 - 5 + 1) = 3 (当前子串 “bc”)
最终结果

在遍历完整个字符串后,result 的值是 3,表示最长无重复字符子串的长度为 3(例如 “abc”)。

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

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

相关文章

洛谷P3478 [POI2008] STA-Station(换根dp)

题目链接 https://www.luogu.com.cn/problem/P3478 思路 对于 n 1 e 6 n1e6 n1e6&#xff0c;我们考虑换根dp。 定义 f [ u ] f[u] f[u]表示以 u u u为根的子树中&#xff0c;所有节点的深度之和。定义 d p [ u ] dp[u] dp[u]表示整棵树以 u u u为根时&#xff0c;所有节点…

Clip模型详解

CLIP(Contrastive Language-Image Pre-training)是由OpenAI在2021年推出的一种基于对比学习的多模态预训练模型,它通过大规模的图像和文本数据进行训练,使得模型能够理解图像内容和相关文本之间的语义关系。这种模型能够同时理解文本和图像,可以看作是一个连接语言和视觉两…

制药企业MES与TMS的数据库改造如何兼顾安全与效率双提升

*本图由AI生成 在全球制造业加速数字化转型的浪潮中&#xff0c;一家来自中国的、年营业额超过200亿元的制药企业以其前瞻性的视角和果断的行动&#xff0c;成为该行业里进行国产化改造的先锋。通过实施数据库改造试点项目&#xff0c;该企业实现了其关键业务系统MES&#xff0…

python的多线程和多进程

首先需要明确的是&#xff0c;多进程和其他语言的一样&#xff0c;能够利用多核cpu&#xff0c;但是python由于GIL的存在&#xff0c;多线程在执行的时候&#xff0c;实际上&#xff0c;每一时刻只有一个线程在执行。相当于是单线程。然而多线程在某些情况下&#xff0c;还是能…

使用 python 下载 bilibili 视频

本文想要达成的目标为&#xff1a;运行 python 代码之后&#xff0c;在终端输入视频链接&#xff0c;可自动下载高清 1080P 视频并保存到相应文件夹。 具体可分为两大步&#xff1a;首先&#xff0c;使用浏览器开发者工具 F12 获取请求链接相关信息&#xff08;根据 api 接口下…

Leetcode 1514. 概率最大的路径

1.题目基本信息 1.1.题目描述 给你一个由 n 个节点&#xff08;下标从 0 开始&#xff09;组成的无向加权图&#xff0c;该图由一个描述边的列表组成&#xff0c;其中 edges[i] [a, b] 表示连接节点 a 和 b 的一条无向边&#xff0c;且该边遍历成功的概率为 succProb[i] 。 …

Python知识点:基于Python工具,如何使用Scikit-Image进行图像处理与分析

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 基于Python的Scikit-Image图像处理与分析指南 在Python的科学计算生态系统中&am…

3万字66道Java基础面试题总结(2024版本)

本文合计三万字&#xff0c;整合了66道当前Java面试中比较热门的面试题&#xff0c;希望对大家有所帮助。 文章目录 一、Java概念1. JDK和JRE和JVM的区别2. Java语言有哪些特点3. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f;4. Oracle JDK 和 OpenJDK 的对…

【3dgs】Gaussian-SLAM发展关键历程梳理

【3dgs】Gaussian-SLAM 0. 写在前面1. 3D Splatting与SLAM流程2. Splatting SLAM&#xff1a;单目/RGB-D(2024年新作&#xff09;2.1 相机跟踪精度2.2 新视图渲染性能2.3 消融实验 3. Gaussian-SLAM&#xff08;Photo-SLAM&#xff09; Photo-SLAM技术原理详解 ORBSLAM3dGS&am…

OKG Research:如何衡量链上数据的开放价值?

在新加坡Token2049期间&#xff0c;欧科云链研究院受邀参加Bloomberg主办的企业另类资产投资峰会2024&#xff0c;与多位专家围绕未来数据形态与前景进行了深入交流。 活动后&#xff0c;欧科云链研究院负责人Lola Wang与资深研究员Jason Jiang在大公网发表署名文章《如何衡量…

faust,一个神奇的 Python 库!

大家好&#xff0c;今天为大家分享一个神奇的 Python 库 - faust。 Github地址&#xff1a;https://github.com/robinhood/faust 在分布式系统和实时数据处理的世界里&#xff0c;消息流处理&#xff08;Stream Processing&#xff09;变得越来越重要。Faust 是一个 Python 库…

【工具变量】上市公司企业广告支出数据(2007-2023年)

一、测算方式&#xff1a;具体而言&#xff0c;参照 Lu 等&#xff08;2022&#xff09;的研究&#xff0c;本文通过上市公司财务报表附注获取每家上市公司每年销售费用明细项目&#xff0c;筛选出广告费、广告宣传费、广告推广费、广告策划费、广告展览费等与广告支出相关的项…

Python入门笔记(二)

文章目录 第六章 列表list6.1 创建列表&#xff1a;[]、list()、列表生成式6.2 索引访问元素、元素返回索引index()6.3 列表增加元素:append()、extend()、insert()6.4 列表删除元素&#xff1a;remove()、del()、pop()、clear()6.5 列表修改元素6.6 排序&#xff1a;.sort()、…

防火墙的三种工作模式:路由模式、透明模式(网桥)、混合模式

防火墙作为网络安全的核心设备之一&#xff0c;扮演着至关重要的角色。它不仅能够有效防御外部网络的攻击&#xff0c;还能保护内部网络的安全。在如今复杂多样的网络环境下&#xff0c;防火墙的部署和工作模式直接影响着网络安全策略的实施效果。防火墙通常可以工作在三种模式…

自定义函数查看OS的file cache

简介 在OS中使用cache机制&#xff0c;主要为了提高磁盘的读取效率&#xff0c;避免高频的IO交换。将频繁访问的数据存放在file cache中&#xff0c;下一次在获取的时候就可以直接读取&#xff0c;缓存高命中率对于数据高速检索十分有利。 smem smem 是一个可以显示 Linux 系…

Spring Boot比Spring多哪些注解

Spring Boot相对于Spring框架而言&#xff0c;引入了一些特有的注解来简化配置、自动装配组件和实现声明式服务。以下是一些Spring Boot相对于Spring框架特有的主要注解&#xff1a; SpringBootApplication&#xff1a; 作用&#xff1a;标注一个主程序类&#xff0c;表明这是一…

前端怎么实现电子签名

电子签名&#xff08;e-signature&#xff09;作为一种数字化的签署方式&#xff0c;广泛应用于合同、协议等文件的确认中。随着科技的发展&#xff0c;前端技术也为电子签名的实现提供了便利。本文将探讨在前端如何实现电子签名&#xff0c;包括技术选型、实现步骤及注意事项。…

【即见未来,为何不拜】聊聊分布式系统中的故障监测机制——Phi Accrual failure detector

前言 昨天在看tcp拥塞控制中的BBR(Bottleneck Bandwidth and Round-trip propagation time)算法时&#xff0c;发现了这一特点&#xff1a; 在BBR以前的拥塞控制算法中(如Reno、Cubic、Vegas)&#xff0c;都依赖于丢包事件的发生&#xff0c;在高并发时则会看到网络波动的现象…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来&#xff0c;说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦