当前位置:网站首页>无重复字符的最长子串
无重复字符的最长子串
2022-08-09 12:01:00 【爱敲代码的Harrison】
题目
力扣链接:无重复字符的最长子串
题解
子串问题(或子序列问题)规律总结:必须以i位置结尾怎样怎样 或者 必须以i位置开始怎样怎样;把每个位置的答案求出了,最终答案就是所有答案中的最大值
子串跟子序列的区别:子串是必须连续的,子序列可以要求不连续
这个题就只有两个因素影响
- 上一个重复字符出现的位置在哪
- i-1位置结尾,往左推了多远
如何记录上一个重复字符出现的位置呢?可以用一个map,也可以自己用数组代替map。(建议能不用map的情况下,就不用map。虽然map的增删改查时间复杂度是O(1),数组寻址比map查找,在常数时间上更快一点!下文会举例子测试)
自己用数组代替map,数组的长度如何确定呢?如果给定的字符串只有大小写字母,那么数组长度可以改为128;如果给定的字符串只有小写字母,那么数组长度可以改为26
为什么要记录i-1位置结尾的情况下,往左推了多远呢?
因为此题的答案就是上述两个影响因素谁离我当前位置近,谁就是答案!
并且记录i-1位置结尾的情况下,往左推了多远,还有一个好处。我们不需要生成一个dp数组,每次都查找一遍;可以只用有限几个变量来滚动记录。因为要求的无重复字符的最长子串的长度就是上述两个影响因素谁离我近,最后下标相减,最后取最大值就是答案。
代码
public int lengthOfLongestSubstring(String s) {
if(s==null || s.equals("")){
return 0;
}
char[] str=s.toCharArray();
// 用数组代替map,常数时间会更快一点(map用来记录上一个重复字符出现的位置)
// 如果给定的字符串只有大小写字母,那么数组长度可以改为128
// 如果给定的字符串只有小写字母,那么数组长度可以改为26
int[] map=new int[256];
for(int i=0; i<256; i++){
map[i]=-1;
}
int len=0;
// pre记录i-1位置结尾的情况下,往左推,推不动的位置
int pre=-1;
int cur=0;
for(int i=0; i!=str.length; i++){
// i位置结尾的情况下,往左推,推不动的位置
// pre(i-1位置的信息) 更新为 i位置的信息
pre=Math.max(pre,map[str[i]]);
cur=i-pre;
len=Math.max(len,cur);
map[str[i]]=i;
}
return len;
}
时间复杂度分析
时间复杂度为O(N),额外空间复杂度为O(1)
虽然申请了一个长度为256的数组,但是是固定长度,跟N没有关系,所以这个操作的空间复杂度是O(1),此外还申请了几个变量,所以空间复杂度为O(1)
除了一个for循环,其余操作的时间复杂度都是O(1),所以时间复杂度是O(N)
map和数组查找的效率比较
上文说过,两者的时间复杂度都是O(1),但是数组寻址的常数时间比map更快一点。
可能用map查找的时候,JVM里面会有些缓存,所以区别不是
特别明显。
用毫秒看不出区别,用纳秒区别也不大,而且map竟然还快一点,可能是缓存的问题吧,本来还可以用微妙去试一下,到那时Java中没有直接获取微妙的方法,所以就没弄了,但是数组寻址确实是比map查找的常数时间更快一点,这一点毋庸置疑!
边栏推荐
- Byte Qiu Zhao confused me on both sides, and asked me under what circumstances would the SYN message be discarded?
- 二重指针-char **、int **的作用
- 又有大厂员工连续加班倒下/ 百度搜狗取消快照/ 马斯克生父不为他骄傲...今日更多新鲜事在此...
- Golang学习之路(五):Golang的函数
- 【重要】C语言进阶 -- 自定义类型:结构体、枚举、联合
- IDEA 关闭/开启引用提示Usages
- 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端
- Gumbel_Softmax 概要
- 正则表达式(规则,匹配,和实际使用)
- Here comes the question: Can I successfully apply for 8G memory on a machine with 4GB physical memory?
猜你喜欢
AQS Synchronization Component - FutureTask Analysis and Use Cases
GRPC整体学习
防止数据冒用的方法
proto3-2语法
WeChat side: what is consistent hashing, usage scenarios, and what problems does it solve?
shell脚本------函数的格式,传参,变量,递归,数组
无需精子卵子子宫体外培育胚胎,Cell论文作者这番话让网友们炸了
世界第4疯狂的科学家,在103岁生日那天去世了
问题来了:4GB物理内存的机器上申请8G内存能成功吗?
基于CAP组件实现补偿事务与幂等性保障
随机推荐
Nature:猪死亡1小时后,器官再次运转
Simple understanding of ThreadLocal
【无标题】
LeetCode热题(11.合并两个有序链表)
AI篮球裁判火了,走步算得特别准,就问哈登慌不慌
问题来了:4GB物理内存的机器上申请8G内存能成功吗?
Adalvo收购其首个品牌产品Onsolis
Blazor Server (9) from scratch -- modify Layout
LeetCode #101. Symmetric Binary Tree
proto3-2 syntax
用 API Factory 产品生成 API 文档
【微服务~远程调用】整合RestTemplate、WebClient、Feign
#物联网征文#小熊派设备开发实战
在北极都可以穿短袖了,温度飙升至32.5℃
苹果Meta都在冲的Pancake技术,中国VR团队YVR竟抢先交出产品答卷
ABP 6.0.0-rc.1的新特性
非科班AI小哥火了:他没有ML学位,却拿到DeepMind的offer
MySQL 原理与优化,Group By 优化 技巧
MySQL查询性能优化七种武器之索引潜水
AQS Synchronization Component - FutureTask Analysis and Use Cases