题目
给定一个字符串s
,请找出其中不含重复子串的最长连续子字符串的长度
思路
使用滑动模块来实现最长的子串的记录实现,使用一个set
来记录滑块中间存在的元素,实现滑块的移动判断,使用循环将数据进行遍历之后将滑块进行滑动,进过一个数组的长度的移动之后,中间使用ans
来记录最长的长度最后直接返回ans
就实现了题目的要求
代码java
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<Character>();
char[] c = s.toCharArray();
int left = 0;
int ans = 0;
for(int i = 0; i < c.length; i++){
//存在元素,滑动
if(set.contains(c[i])){
while(set.contains(c[i])){
//如果还存在窗口就将滑块进行移动
//返回移动之后的滑块实现滑动
set.remove(c[left]);
left++;
}
}
//不存在元素之后添加
set.add(c[i]);
ans = Math.max(ans, i - left + 1);
}
return ans;
}
}
复杂度分析
循环遍历的数据的长度即时间复杂度是O(n)
的,但是最坏情况下就是O(n)
的复杂度了,就是数据里面是交替出现的数据,内层的while循环也是O(n)
的所以最坏时间复杂度就是O(n^2)
的了,使用hashSet
一般会被认为是O(1)
的。空间复杂度就是所有的元素就是O(n)
的了