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

本文深入探讨了如何寻找字符串中最长的不包含重复字符的子字符串,并详细讲解了一种名为“暴力滑动窗口”的算法实现过程。通过具体实例演示了算法的运行逻辑,包括如何维护一个辅助字符串以跟踪当前不重复子串的状态,以及如何更新最大长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

题目链接:剑指 Offer 48. 最长不含重复字符的子字符串

例:

  1. 输入 "abcabcbb"         输出 3
  2. 输入 "bbbbb"               输出 1

思路

1.暴力滑动窗口

此方法是我看了滑动窗口的描述后自己写的,没参考别人的设计但是时间消耗不忍直视。

我在我的解法中设计了一个辅助空串helper和用于记录最大长度的n,之后将原字符串s遍历并判断:

  1. 对于s中的每一个字符_s,如果helper里的每一个字符都和_s不同,那么直接将_s拼接到helper尾部;
  2. 若相同,则对helper进行切片,切片位置就是helper中第一个和_s重复的字符的索引下标,之后再将_s拼接到helper尾部。

之后再判断当前串的长度是否是最大长度,若是则更新用来保存最大长度的参数n。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        n = 0  # 记录最大长度
        helper = ""  # 辅助串

        for _s in s:
            if helper == "":  # 如果辅助串为空,直接添加(这里应该可以优化)
                helper += _s
            
            for i in range(len(helper)):  # 对辅助串内已有的元素遍历,看是否与当前操作的_s相同
                if helper[i] == _s:
                    helper = helper[i+1:]  # 相同,则切片
                    break  # 直接跳出循环
            
            helper += _s

            if len(helper) > n:  # 判断当前辅助串的长度是否是最大长度
                n = len(helper)
            
        return n

2.待续...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值