LeetCode 3. Longest Substring Without Repeating Characters

LeetCode 3. Longest Substring Without Repeating Characters (无重复字符的最长子串)

题目

链接

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

问题描述

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

示例

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

提示

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

思路

滑动窗口的题目。

设置一个数对window表示我们所用的窗口。leftright表示左右边界。每次从右侧增加,如果该字符已经存在,就从左侧删除,直到该字符不重复,这时更新ans。

复杂度分析

时间复杂度 O(n)
空间复杂度 O(n)

代码

Java

    public static int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> window = new HashMap<>();
        int len = s.length();
        int left = 0, right = 0;
        int ans = 0;
        while (right < len) {
            char ch = s.charAt(right);
            right++;
            window.put(ch, window.getOrDefault(ch, 0) + 1);
            while (window.get(ch) > 1) {
                char remove = s.charAt(left);
                left++;
                window.put(remove, window.get(remove) - 1);
            }
            ans = Math.max(ans, right - left);
        }
        return ans;
    }
posted @ 2020-02-17 20:45  cheng102e  阅读(75)  评论(0编辑  收藏  举报