LeetCode: 3 无重复字符的最长子串 (Java)
2024-10-02 04:01:45
3. 无重复字符的最长子串
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
最初始的解法方法就是遍历暴力每个元素,然后以那个元素为起始点,然后进行判断是否出现了重复元素,这样时间的复杂度就是O(n2),这样的时间复杂度有点高,基本上已经预定了时间超出限制。所以我们要用别的解法方法。
那么比较好的解决方法就是用 双指针的思想,这题其实把握了思想还是挺简单的,要保证无重复的的,一般会先想到HashSet,可以保证数组的字符的唯一性。
设置一左一右两个指针,每次我们都移动右指针,如果右边的指针中的元素在Set中存在了,那么就要开始根据已经存在的元素移动左边指针了。同时我们要把左右指针里面的元素所在的索引值(index)给保存下来。
代码还是很好理解的:
show the code
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) return 0;
Set<Character> set = new HashSet<>();
LinkedList<Integer> list = new LinkedList<>();
char[] charsArray = s.toCharArray();
int left = 0;
int res = 0;
for (int right = 0, len = charsArray.length; right < len; ++right) {
if (set.contains(charsArray[right])) {
res = Math.max(res, right - left);
while (set.contains(charsArray[right])) {
int index = list.removeFirst();
set.remove(charsArray[index]);
}
list.addLast(right);
left = list.getFirst();
set.add(charsArray[right]);
} else if (right == len - 1) {
res = Math.max(res, right - left + 1);
} else {
set.add(charsArray[right]);
list.addLast(right);
}
}
return res;
}
时间复杂度O(n),空间复杂度O(n)。
最新文章
- 查linux端口连接情况用命令netstat
- Linux内核--网络栈实现分析(十)--网络层之IP协议(下)
- Python序列化之json与pickle
- python数学运算的类型转换
- hbase读写流程
- maven插件开发(二)
- cocos2d-x学习日志(10) --射击游戏(喵星战争)
- Acer VN7 Win10小键盘修改
- 块和内嵌div和span
- mybatis基础学习2---(resultType和resultMap的用法和区别)和setting的用法
- Enable multi-tenancy on ironic
- EasyUI Parser 解析器
- imp 导入报错
- Python之模块和包
- Day032--Python--操作系统, process进程
- 20165237 2017-2018-2 《Java程序设计》第8周学习总结
- python学习之旅(十五)
- 【转载】Ubuntu安装之,硬盘分区
- Vue项目中如何使用Element-UI以及如何使用sass
- 本地Navicat连不上Linux虚拟机MySQL数据库问题
热门文章
- git(二)
- IM即时通讯:如何跳出传统思维来设计聊天室架构?
- Kafka 学习之路(五)—— 深入理解Kafka副本机制
- 【小记整理】mybatis配置多个扫描路径写法
- 【朝花夕拾】Android自定义View篇之(五)Android事件分发机制(上)Touch三个重要方法的处理逻辑
- 通用shell函数库
- 跟着大彬读源码 - Redis 2 - 服务器如何响应客户端请求?(上)
- POJ 3318:Matrix Multiplication(随机算法)
- 性能测试即服务-docker部署jmeter及.netcore应用
- leetcode 141 Linked List Cycle Hash fast and slow pointer