3.无重复字符的最长子串
使用滑动窗口:
- 使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表着枚举字串的起始位置,而右指针即为 r k r_k rk
- 在每一步操作中,我们会将左指针向右移动一格,表示我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串,记录下这个子串的长度
- 在枚举结束后,找到的最长子串的长度就是答案
class Solution {
public int lengthOfLongestSubstring(String s) {
//哈希集合,记录每个字符是否出现过
Set<Character> occ = new HashSet<Character>();
int n = s.length();
//右指针,初始值为-1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1,ans = 0;
for (int i = 0;i< n ;i++){
if(i != 0){
//左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i-1));
}
while(rk+1<n && !occ.contains(s.charAt(rk + 1))){
//不断地移动右指针
occ.add(s.charAt(rk + 1));
++rk;
}
//第i到rk个字符是一个极长的无重复字符子串
ans = Math.max(ans,rk-i+1);
}
return ans;
}
}