3. Longest Substring Without Repeating Characters - Medium

Posted fatttcat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. Longest Substring Without Repeating Characters - Medium相关的知识,希望对你有一定的参考价值。

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3 
Explanation: The answer is "abc", with the length of 3. 

Example 2:

Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

Example 3:

Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3. 
             Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

 

M1: sliding window + hash map (more generalize)

用d表示所求substring长度。fast扫描string,存进map。用counter计数,如果map中对应value > 1,counter++。当counter > 0时进入while循环开始移动slow找有效的substring,如果slow所指的字符对应出现次数 > 1,counter--,并存入新的value,slow向右移动。退出while循环时即找到有效substring,此时记录fast - slow,并和d比较,取较大值。

time: O(n), space: O(n)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> map = new HashMap<>();

        int slow = 0, fast = 0, counter = 0, d = 0;
        while(fast < s.length()) {
            char c = s.charAt(fast);
            map.put(c, map.getOrDefault(c, 0) + 1);
            if(map.get(c) > 1) {
                counter++;
            }
            fast++;
            
            while (counter > 0) {
                char tmp = s.charAt(slow);
                if (map.get(tmp) > 1) {
                    counter--;
                }
                map.put(tmp, map.get(tmp) - 1);
                slow++;
            }
            d = Math.max(d, fast - slow);
        }
        return d;
    }
}

 

M2: sliding window + hash set (specific to unique character)

time: O(n), space: O(n)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> set = new HashSet<>();

        int slow = 0, fast = 0, max = 0;
        while(fast < s.length()) {
            if(!set.contains(s.charAt(fast))) {
                max = Math.max(max, fast - slow + 1);
                set.add(s.charAt(fast++));
            } else {
                set.remove(s.charAt(slow++));
            }
        }
        return max;
    }
}

 

以上是关于3. Longest Substring Without Repeating Characters - Medium的主要内容,如果未能解决你的问题,请参考以下文章

longest-substring-with-at-least-k-repeating-characters

LeetCode 395. Longest Substring with At Least K Repeating Characters

395. Longest Substring with At Least K Repeating Characters

3. Longest Substring Without Repeating Characters

Leetcode: Longest Substring with At Least K Repeating Characters

395. Longest Substring with At Least K Repeating Characters