列表

详情


剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

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

原站题解

去查看

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

golang 解法, 执行用时: 8 ms, 内存消耗: 2.6 MB, 提交时间: 2022-11-14 10:36:11

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
}

python3 解法, 执行用时: 80 ms, 内存消耗: 15.2 MB, 提交时间: 2022-11-14 10:35:24

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

上一题