博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
力扣 3. 无重复字符的最长子串
阅读量:3914 次
发布时间:2019-05-23

本文共 1214 字,大约阅读时间需要 4 分钟。

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

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

示例 1:

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

示例 2:

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

示例 3:

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

思路:

1. 两个指针,一个指针指针 i 指向当前元素 i,另一个指针 j 不断往后探测,直到遇到一个在 (j - i) 区间中有重复的数字,j - i 即为以 i 为起点的最长不重复子串的长度

2. 用一个HashSet存储 j 探测到的没有重复的字符,j每后移一个就添加一个字符,i每后移一个就删除一个字符,如果 j 遇到重复字符后会等i越过这个字符才会继续往后探测

1 class Solution { 2     public int lengthOfLongestSubstring(String s) { 3         // 4  5         // j - i即为以i为起点的最长不重复子串的长度 6  7         // 一个HashSet,保存从i到j的所有不重复字符 8         HashSet
set = new HashSet<>(); 9 int j = 0;10 int n = s.length();11 int len = 0;12 for(int i = 0; i < n; i++){13 if(i != 0){14 set.remove(s.charAt(i - 1)); // 移除前一个字符15 }16 // 不重复则后移17 for(;j < n && !set.contains(s.charAt(j));j++){18 set.add(s.charAt(j));19 }20 len = Math.max(len, j - i);21 }22 return len;23 }24 }

复杂度分析:

i, j 指针均需遍历一次字符串,所以时间复杂度为O(2n), 也就是O(n)

空间复杂度的话,主要是看set集合存储字符的个数,最多存储字符串的长度个字符,所以空间复杂度为O(n)

转载地址:http://rndrn.baihongyu.com/

你可能感兴趣的文章
.NET架构小技巧(6)——什么是好的架构
查看>>
C#中形态各异的class
查看>>
.Net 5性能改进
查看>>
InfluxDB 2.0 之Flux语法篇
查看>>
TensorFlow 2学习和工业CV领域应用 心得分享
查看>>
程序员过关斩将--真的可以用版本号的方式来保证MQ消费消息的幂等性?
查看>>
Java面试必问JVM调优,那.NET5呢?
查看>>
把 Console 部署成 Windows 服务,四种方式总有一款适合你!
查看>>
缓存一致性和跨服务器查询的数据异构解决方案canal
查看>>
BeetleX之Websocket服务使用
查看>>
【源码】常用的人脸识别数据库以及上篇性别识别源码
查看>>
深入探究ASP.NET Core Startup的初始化
查看>>
跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了(总结了一张思维图)...
查看>>
一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试
查看>>
IdentityServer4系列 | 资源密码凭证模式
查看>>
TIOBE 11 月榜单:Python 挤掉 Java,Java的下跌趋势确立了?
查看>>
C#实现观察者模式
查看>>
使用Azure静态Web应用部署Blazor Webassembly应用
查看>>
Win10 Terminal + WSL 2 安装配置指南,精致开发体验
查看>>
Xamarin 从零开始部署 iOS 上的 Walterlv.CloudKeyboard 应用
查看>>