当前位置:网站首页>LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现
2022-08-03 09:06:00 【InfoQ】
欢迎访问我的GitHub
- 本文是《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲》的第二篇,前一篇文章已经列出了完整的解题思路,今天来将此思路转化为具体的Java代码;
关键变量
- 编码之前先确定几个关键变量:
- 当前窗口中的元素都是不重复的,适合用一个HashSet来保存;
- max变量记录最长子串的长度;
- left表示窗口左侧相对整个字符串的位置,right表示窗口右侧相对整个字符串的位置,如下图:
代码实现
- 以下是代码,关键位置都有详细注释:
public class Solution1 {
public int lengthOfLongestSubstring(String s) {
//窗口的起始位置,窗口的结束为止,最长记录
int left = 0, right = 0, max = 0;
//表示窗口内有哪些值
Set<Character> set = new HashSet<>();
while (right < s.length()) {
//例如"abcdc",窗口内是"abcd",此时right等于[4],
//发现窗口内有array[right]的值,就缩减窗口左边,
//缩到窗内没有array[right]的值为止,
//当left一路变大,直到left=3的时候,窗口内已经没有array[right]的值了
if (set.contains(s.charAt(right))) {
//假如窗口内是"abc",当前是"c",那么下面的代码只会将"a"删除,left加一,再次循环
//而新一次循环依旧发现"c"还在set中,就再把"b"删除,left再加一...
set.remove(s.charAt(left++));
} else {
//窗口内没有array[right]的时候,就把array[right]的值放入set中,表示当前窗口内有哪些值
set.add(s.charAt(right++));
if ((right - left) > max) {
max = right - left;
}
}
}
return max;
}
public static void main(String[] args) {
System.out.println(new Solution1().lengthOfLongestSubstring("abcabcbb"));
}
}
- 上述代码的关键是set.remove(s.charAt(left++)),配合着外面的while循环,"left++"表示将窗口向右移动一个元素,并且将窗口中最左侧的元素从set中删除;
- 上述代码在LeetCode上提交成功,不过运行时间超过40ms,成绩并不理想,接下来的文章我们一起来做优化提升速度;
欢迎关注InfoQ:程序员欣宸
边栏推荐
- gpnmb+ gpnmb-AT2 cell空转映射 上皮细胞的空转映射
- 机器学习(公式推导与代码实现)--sklearn机器学习库
- 10 minutes to get you started chrome (Google) browser plug-in development
- RViz报错: Error subscribing: Unable to load plugin for transport ‘compressed‘解决方法
- 【LeetCode】226. Flip the binary tree
- 【论文笔记】一种基于启发式奖赏函数的分层强化学习方法
- 【LeetCode】112. Path sum
- 多媒体数据处理实验2:PCA
- 多媒体数据处理实验1:算术编码
- 关于Unity,Laya学习,第一步加载Unity加载场景
猜你喜欢
Industry SaaS Microservice Stability Guarantee Actual Combat
10 minutes to get you started chrome (Google) browser plug-in development
FusionAccess软件架构、FusionAccess必须配置的四个组件、桌面发放流程、虚拟机组类型、桌面组类型
English Grammar - Adverbial Clauses
Cartesi 2022 年 7 月回顾
redis stream 实现消息队列
scala 并行集合、并行并发、线程安全问题、ThreadLocal
Flink Yarn Per Job - Submit application
开发工具之版本控制
RSTP(端口角色+端口状态+工作机制)|||| 交换机接口分析
随机推荐
scala 并行集合、并行并发、线程安全问题、ThreadLocal
【LeetCode】112. Path sum
Industry SaaS Microservice Stability Guarantee Actual Combat
【TPC-DS】DF的SQL(Data Maintenance部分)
uniapp swiper 卡片轮播 修改指示点样式效果demo(整理)
SQL每日一练(牛客新题库)——第5天:高级查询
基于百度AI和QT的景物识别系统
Path Prefixes (倍增!树上の二分)
Redis的基础与django使用redis
MySQL1
What are pseudo-classes and pseudo-elements?The difference between pseudo-classes and pseudo-elements
dflow入门1——HelloWorld!
WPF 学习笔记《WPF样式基础》
索引(三)
【愚公系列】2022年07月 Go教学课程 026-结构体
线程介绍与使用
Guava-字符串工具
【LeetCode】101.对称二叉树
Redis集群概念与搭建
多媒体数据处理实验3:图像特征提取与检索