python每日一题——8无重复字符的最长子串

题目

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

示例 1:

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

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

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

答案

这个问题可以使用滑动窗口算法来解决。

首先,我们定义一个变量 max_len 来记录最长子串的长度,并初始化为 0。

然后,我们定义一个集合 char_set 来记录当前窗口内出现的字符,并初始化为空集。

接下来,我们使用一个指针 left 来表示当前窗口的左边界,初始化为 0。

然后,我们使用一个指针 right 来表示当前窗口的右边界,初始化为 0。

在每次循环中,我们将 right 向右移动一位,并将当前字符加入到 char_set 中。

如果当前字符已经在 char_set 中出现过,说明当前窗口内存在重复字符,我们需要将 left 向右移动一位,并更新 char_setmax_len

最后,我们返回 max_len 即可。

以下是 Python 代码实现:

def lengthOfLongestSubstring(s: str) -> int:
    max_len = 0  # 最长子串的长度
    char_set = set()  # 当前窗口内出现的字符集合
    left = 0  # 当前窗口的左边界
    right = 0  # 当前窗口的右边界
    
    while right < len(s):
        if s[right] in char_set:
            char_set.remove(s[left])
            left += 1
        char_set.add(s[right])
        max_len = max(max_len, right - left + 1)
        right += 1
    
    return max_len

你可能感兴趣的:(算法练习,python,算法,动态规划)