3. 中等 无重复字符的最长子串 Longest Substring Without Repeating Characters
难度:中等
今天就更新一个思路清新的题吧。
方法一:双指针+HashSet
首先是第一次做的也是较容易想到的滑动窗口+哈希表方法。这个不多讲了。HashSet可以用于去重。
classSolution{publicintlengthOfLongestSubstring(String s){
Set<Character> occ =newHashSet<>();int len = s.length();int r =-1;int ans =0;for(int i =0; i < len;++i){if(i !=0){
occ.remove(s.charAt(i -1));}while(r +1< len &&!occ.contains(s.charAt(r +1))){
occ.add(s.charAt(r +1));++r;}
ans = Math.max(ans, r - i +1);}return ans;}}
时间复杂度:左指针和右指针共遍历两次数组,复杂度
O
(
n
)
\mathcal{O}(n)
O(n)。
空间复杂度:需要的HashSet大小与字符集的大小有关,复杂度
O
(
∣
Σ
∣
)
\mathcal{O}(|\Sigma|)
O(∣Σ∣)。
classSolution{privateint ans =0;publicintlengthOfLongestSubstring(String s){int[] last =newint[128];int left =0;int n = s.length();for(int i=0;i<n;i++){int index = s.charAt(i);
left = Math.max(left,last[index]+1);//记录的是最右边的出现情况
ans = Math.max(ans,i-left+1);
last[index]= i;}return ans;}}
时间复杂度:遍历两次数组,复杂度
O
(
n
)
\mathcal{O}(n)
O(n)。
空间复杂度:需要一个长度128的数组,与字符集的大小有关,复杂度
O
(
∣
Σ
∣
)
\mathcal{O}(|\Sigma|)
O(∣Σ∣)。