给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
在写算法题目的时候,首先要有思路,不要盲目动笔,同时要注意题目的要求,在看到不含有重复字符的时候,应该想到用哪个数据结构,在Java集合中,Set集合符合这个条件(无序且不重复),那么该怎么写呢?可以想到要用到滑动窗口的思想,一个左指针,一个右指针,两个指针的范围都是0-len,所以我们可以让右指针一直前进,直到遇到重复的字符,然后得到此时子串的长度,并与之前的结果取一个较大值,然后就是左指针前进一步,重复上述步骤,直到左指针到达字符串的最右侧
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<>();
// rk为右指针
int ans = 0, rk = 0;
int n = s.length();
// i为左指针
for (int i = 0; i < n; i++) {
// 当i不是0的时候要将上一个字符从set中移除
if (i != 0) {
set.remove(s.charAt(i - 1));
}
// 当rk<n并且set集合中不含有rk代表的字符时rk一直前进
while (rk < n && !set.contains(s.charAt(rk))) {
// 将不重复的字符加入到set集合中
set.add(s.charAt(rk++));
}
// 对于当前子串的长度和之前的结果取一个较大值
ans = Math.max(ans, rk - i);
}
return ans;
}