# 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长

度。

1 示例 1:

2 输入: s = "abcabcbb"

3 输出: 3

4 解释:因为无重复字符的最长子串是 "abc",所以其长度为 3。

public class Demo03
{
    public static void main(String[] args)
    {
        String str = "aabiecuot";
        int dan = dan(str);
        System.out.println(dan);
    }
    public static int dan(String s)
    {
        int n = s.length();
        Set<Character> set = new HashSet<>();
        int rk = 0;
        int ans = 0;
        for(int i = 0;i < s.length();i ++){
            // 因为要检查不重复的字符所以需要将当前的字符先从集合中删除
            if(i != 0){
                // 删除上一个字符
                set.remove(s.charAt(i - 1));
            }
            // 计算不重复的字符的数量
            //rk + 1 < n 边界限制,判断集合中是否已经包含了某个字符
            while(rk < n && !set.contains(s.charAt(rk))){
                // 如果不包含就将该字符添加到集合中
                set.add(s.charAt(rk));
                // 向后移动
                rk++;
            }
            // 取最大的自增数
            ans = Math.max(ans,rk - i);
        }
        return ans;
    }
}

思路分析:

  1. 判断 i!=0 的话就删除上一个字符,因为下次遍历的时候需要把之前那个重复的先删除了它存在的话下次也不会进入某些操作中,因为要拿重复的其中一个与其他的字符作比较
  2. while 循环 rk 大于 n 并且 集合中 不存在 rk 位置的字符就将该字符添加到集合中并 rk++
  3. 获取最大的自增数也就是最大的不重复数
  4. 返回不重复数