[TOP INTERVIEW QUESTIONS] 最长无重复子串

423 阅读1分钟

今天这道题蛮有趣,话不多说,先上题目:

给你一个string,找出最长的不重复子串。


字串?最长?第一次接触可能会有点懵。

(画重点!!!)

这一道题属于经典的 Sliding Window 题目(滑动窗口)。

什么是Sliding Window

通俗地来讲,滑动窗口算法用于在给定的数组的特定窗口大小上执行所需的操作。 窗口从第一个元素开始,并一直向右移动。

看一下示例:

  1. 首先,我们先定义左右指针(左右边界,控制窗口的大小)
  2. 移动右指针,直到遇到重复的字母就停止,保存当前字串的长度。
  3. 左指针向前一个单位,直到子串没有重复,右指针不动。(因为已经重复了,再移动右指针也没用):
  4. 右指针继续搜寻(尽可能扩大字串的长度),直到遇到重复的字母停止,及时追踪子串的长度,若当前最长,更新 res的值。(子串有可能所有字母无重复)

重复上述过程。

总结

  1. HashMap 和 HashSet 在面试题中十分常见,需要熟练掌握。
  2. 滑动窗口可以有效避免重复计算,加快扫描速度。

代码(Java)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        if (s.length() == 1) {  // corner case
            return 1;
        }
        int left = 0;  // left pointer
        int right = 0;  // right pointer
        int res = 0;
        HashSet<Character> set = new HashSet<Character>();
        while (left <= right && right < s.length()) {
            if (!set.contains(s.charAt(right))) {
                set.add(s.charAt(right++));  // move forward the right pointer
                // keep tracking the max length
                // because each character of the string may be unique
                res = Math.max(right - left, res);
            } else {  // we meet repeating character
                set.remove(s.charAt(left++));  // move forward the left pointer
            }
        }
        return res;
    }
}

/*
Time Complexity: O(n)
Space Complexity: O(n)
*/    

个人GitHub: github.com/ceezyyy/Lee…

创作不易,您的点赞是对我最大的支持!