Bootstrap

无重复字符的最长子串

无重复字符的最长子串

1、题目描述

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

在这里插入图片描述

2、解答思路

本题的解答思路是滑动窗口。定义左右指针,分别控制字符串的左边界和右边界;由于需要添加、删除和查询元素,因此选用哈希集合Set作为存储字符串的结构。

  • 若右指针所指元素在哈希集中有相同元素,则左指针右移,哈希集中取出左指针所指元素,循环直至哈希集中不包含与右指针所指元素相等的元素(循环的目的是与右指针所指元素相等的元素可能在哈希集的中间位置,需要循环遍历到该位置并且将其及左边的元素全部移除哈希集中)。
  • 若若右指针所指元素在哈希集中没有相同元素,则右指针右移,且将该元素添加到哈希集中,注意更新最大长度。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int left=0,right=0,ans=0;
        // 哈希集合
        Set<Character> set = new HashSet<>();
        // 将字符串转换为数组来得到指定下标的元素
        char[] ss = s.toCharArray();
        // 扩展右边界
        for(right=0;right<s.length();right++){
            // 若set中存在和右指针相同的元素,则左指针右移
            while(set.contains(ss[right])){
                set.remove(ss[left]);
                left++;
            }
            // 添加当前右边界
            set.add(ss[right]);
            // 更新最大长度
            ans = Math.max(ans, right-left+1);
        }

        return ans;
    }
}
  • 存储字符串的结构使用哈希集更为方便。
  • 取出指定下标的元素时需要将字符串转换为数组更方便实现。
  • 时间复杂度:O(N),其中 N 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。
;