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;}
}