列表

详情


3. 无重复字符的最长子串

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

相似题目

至多包含两个不同字符的最长子串

至多包含 K 个不同字符的最长子串

K 个不同整数的子数组

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int lengthOfLongestSubstring(string s) { } };

python3 解法, 执行用时: 84 ms, 内存消耗: 15 MB, 提交时间: 2022-08-16 10:19:47

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        mp = defaultdict(int)
        n = len(s)
        rk, ans = -1, 0
        for i in range(n):
            if i > 0:
                del mp[s[i-1]]
            while rk + 1 < n and mp[s[rk+1]] == 0:
                mp[s[rk+1]] += 1
                rk += 1
            ans = max(ans, rk-i+1)
        return ans

golang 解法, 执行用时: 12 ms, 内存消耗: 2.7 MB, 提交时间: 2021-07-17 17:11:47

func lengthOfLongestSubstring(s string) int {
    mp := map[byte]int{}
    n := len(s)
    rk, ans := -1, 0
    for i := 0; i < n; i++ {
        if i > 0 {
            delete(mp, s[i-1])  // 移除掉最左侧的字符
        }
        for rk + 1 < n && mp[s[rk+1]] == 0 {
            mp[s[rk+1]]++
            rk++
        }
        ans = max(ans, rk-i+1)
    }
    return ans
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}

上一题