可以使用滑动窗口的方法来解决这个问题。

我们维护一个窗口,窗口中包含的字符都是不重复的。我们使用两个指针left和right来表示窗口的左右边界。初始时,left和right都指向字符串的第一个字符。

然后,我们依次将right向右移动,如果移动后的字符不在窗口中,那么就将其加入窗口,并更新窗口的最大长度;如果移动后的字符已经在窗口中,那么就需要将left向右移动,直到窗口中不包含重复字符为止。

具体实现如下:

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        int left = 0, right = 0;
        int maxLength = 0;
        Set<Character> set = new HashSet<>();

        while (right < n) {
            char c = s.charAt(right);
            if (!set.contains(c)) {
                set.add(c);
                maxLength = Math.max(maxLength, right - left + 1);
                right++;
            } else {
                set.remove(s.charAt(left));
                left++;
            }
        }

        return maxLength;
    }
}

时间复杂度:O(n),其中n是字符串的长度。遍历一次字符串即可。

空间复杂度:O(min(n, m)),其中n是字符串的长度,m是字符集的大小。最坏情况下,字符集的大小等于字符串的长度,此时窗口中的字符都是不重复的,需要使用O(n)的额外空间。但是如果字符集的大小固定,比如只包含英文字母,那么空间复杂度是O(1)

Java实现:给定一个字符串s找出不含重复字符的最长子串的长度

原文地址: https://www.cveoy.top/t/topic/iFH0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录