题目描述
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
题解
① 暴力法
不写了,超出时间限制
② Java: 滑动窗口
思路:利用HashSet,字符串从i开始,末尾计数j增长
如果遇到了**s.charAt(j)**包含在Set中,从i开始一直删除,直到删到没有重复的时候,在把s.charAt(j)加入进去,就像滑动窗口一般。
话不多说,上代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set<Character> set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while(i < n && j < n){
if(!set.contains(s.charAt(j))){
/*
如果不包含:
① 加入s.chatAt(j),更新j
② 更新ans
*/
set.add(s.charAt(j++));
ans = Math.max(ans, j - i);
}
else{
/*
如果包含:
从i一直删除,直到没有j所含的字符
*/
set.remove(s.charAt(i++));
}
}
return ans;
}
}
一些细节:
① Set的方法
(1) contains() 是否包含
(2) add() 加入集合
(3) remove() 从集合中删除
② string的方法
(1) charAt(i) 返回在i处的字符
③ Math.max()方法
返回最大值
效果:
复杂度分析:
1、时间复杂度:O(2n) = O(n) 最差情况下
2、空间复杂度:O(min(m,n))