Skip to content

Latest commit

 

History

History
171 lines (131 loc) · 3.99 KB

File metadata and controls

171 lines (131 loc) · 3.99 KB

题目描述

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

 

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入: s = ""
输出: 0

 

提示:

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

 

注意:本题与主站 3 题相同: https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

解法

因为 s 中可能会出现字母、数字、符号和空格,所以可以用哈希表表示窗口

Python3

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        window = defaultdict(int)
        n, ans = len(s), 0
        left, right = 0, 0
        while right < n:
            ch = s[right]
            right += 1
            window[ch] += 1
            while window[ch] > 1:
                window[s[left]] -= 1
                left += 1
            ans = max(ans, right - left)
        return ans

Java

class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map<Character, Integer> window = new HashMap<>();
        int n = s.length(), ans = 0;
        int left = 0, right = 0;
        while (right < n) {
            char ch = s.charAt(right++);
            window.merge(ch, 1, Integer::sum);
            while (window.get(ch) > 1) {
                window.merge(s.charAt(left++), -1, Integer::sum);
            }
            ans = Math.max(ans, right - left);
        }
        return ans;
    }
}

Go

func lengthOfLongestSubstring(s string) int {
	window := make(map[byte]int)
	n := len(s)
	ans := 0
	left, right := 0, 0
	for right < n {
		ch := s[right]
		right++
		window[ch]++
		for window[ch] > 1 {
			window[s[left]]--
			left++
		}
		ans = max(ans, right-left)
	}
	return ans
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

C++

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() == 0)
            return 0;

        int left = 0;
        int maxlen = 0;
        unordered_set<char> hash;

        for (int right = 0; right < s.size(); right++) {
            while (hash.find(s[right]) != hash.end()) {
                hash.erase(s[left]);
                left++;
            }

            hash.insert(s[right]);
            maxlen = max(maxlen, right - left + 1);
        }

        return maxlen;
    }
};

...