力扣经典算法篇-28-无重复字符的最长子串(左右指针 + Hash统计)

1、题干

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

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成。

2、解题

方法一:(左右指针 + Hash的contains统计)

为什么使用Hash结构进行统计。因为Hash结构在统计元素是否存在时,通过哈希函数找到元素的槽位,时间效率是O(1),相对于数组的遍历O(N),大大提高了效率。
对于局部最优的问题一般可以使用左右指针法,符合预期右指针偏移,不符合预期左指针偏移直到能符合预期。中间结果通过一个变量进行统计。

代码示例:

public static int lengthOfLongestSubstring(String s) {
        // 滑动窗口
        char[] ss = s.toCharArray();
        Set<Character> set = new HashSet<>();//去重
        int res = 0;//结果
        for(int left = 0, right = 0; right < s.length(); right++) {//每一轮右端点都扩一个。
            char ch = ss[right];//right指向的元素,也是当前要考虑的元素
            while(set.contains(ch)) {//set中有ch,则缩短左边界,同时从set集合出元素
                set.remove(ss[left]);
                left++;
            }
            set.add(ss[right]);//将当前元素加入。
            res = Math.max(res, right - left + 1);//计算当前不重复子串的长度。
        }
        return res;
    }

方法二:(左右指针 + Hash的add结果校验)

原理同方法一。
在Java的HashSet结构中,除了contains方法校验是否包含指定元素外,也可以使用add方法的返回结果校验是否包含指定元素。
如果返回false,即添加失败,说明元素已经存在,需要处理左指针右移直到不包含为止;如果返回true,即添加成功,说明不存在,处理右指针向后偏移,并统计本次是否是最优的连续片段。

代码示例:

public static int lengthOfLongestSubstring(String s) {
        if (s.length() == 1) {
            return 1;
        }

        // 统计结果
        int result = 0;
        
        // 左右指针
        int left = 0;
        int right = 0;
        // 中间临时结果,用Set校验提升效率
        Set<Character> hasSet = new HashSet<>();
        while (left <= right && right < s.length()) {   // 边界条件
            // 直接添加右侧元素,如果失败说明已经存在,处理左指针即可;如果成功说明不存在,直接处理右指针。
            boolean addFlag = hasSet.add(s.charAt(right));
            if (addFlag) {
                right++;
                result = Math.max(result, hasSet.size());   // 能添加成功时,需要保存最大的结果
            } else {
                hasSet.remove(s.charAt(left++));
            }
        }
        return result;
    }

向阳出发,Dare To Be!!!

你可能感兴趣的:(算法-力扣经典篇,算法,leetcode,哈希算法)