返回

巧破密码 - 算法 3:无重复字符的最长子串

Android

各位编程爱好者,大家好!欢迎来到算法探秘之旅的第三站。今天,我们将共同探索算法 3:无重复字符的最长子串,了解如何找出给定字符串中不含有重复字符的最长子串的长度。

问题

假设我们有一个字符串s,它由小写字母组成。我们的目标是找出s中不含有重复字符的最长子串的长度。例如,对于字符串"abcabcbb",最长子串是"abc",长度为3。而对于字符串"bbbbb",最长子串是"b",长度为1。

算法步骤

  1. 初始化

    • 定义变量start和end,分别指向s的开头和结尾。
    • 定义变量maxLength,用于存储最长子串的长度。
  2. 循环遍历字符串

    • 使用while循环遍历字符串s。
  3. 更新end

    • 如果end指向的字符不存在于从start到end-1的子串中,则将end右移一位。
  4. 更新maxLength

    • 如果end - start + 1大于maxLength,则将maxLength更新为end - start + 1。
  5. 循环结束

    • 当end到达s的末尾时,循环结束。
  6. 返回结果

    • 返回maxLength。

示例代码

def length_of_longest_substring(s):
    """
    :type s: str
    :rtype: int
    """
    start = 0
    end = 0
    maxLength = 0
    char_index = {}

    while end < len(s):
        if s[end] not in char_index or char_index[s[end]] < start:
            maxLength = max(maxLength, end - start + 1)
            char_index[s[end]] = end
            end += 1
        else:
            start = char_index[s[end]] + 1
            char_index[s[end]] = end

    return maxLength


print(length_of_longest_substring("abcabcbb"))  # 3
print(length_of_longest_substring("bbbbb"))  # 1
print(length_of_longest_substring("pwwkew"))  # 3

结语

至此,我们就完成了算法 3:无重复字符的最长子串的学习。希望大家能够融会贯通,将其应用到实际编程中。期待我们下一次的相遇,让我们继续探索算法世界的奥秘。