LeetCode 无重复字符的最长子串 结果反思

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

最近接连着三晚上,从10点开始去思考这道题。尝试着从队列的结构去思考这道题:代码如下

def lengthOfLongestSubstring(s):
    import copy
    stack = []  
    last_sub_str = [] 
    final_sub_str = []  

    for i in range(len(s)):
        if s[i] not in stack:
            stack.append(s[i])  
        else:
            # print('{}{}'.format(s[i],i+1))
            if len(last_sub_str) > 0:
                for char_last_sub_str in last_sub_str[::-1]:
                    if char_last_sub_str in stack:
                        break
                    else:
                        stack.insert(0,char_last_sub_str)
                if len(stack) > len(last_sub_str):
                    final_sub_str = copy.deepcopy(stack)
                    last_sub_str = copy.deepcopy(stack)
                else:
                    last_sub_str = copy.deepcopy(stack)
                while stack: 
                    stack.pop()
                stack.append(s[i])
            else:
                last_sub_str = copy.deepcopy(stack)
                final_sub_str = copy.deepcopy(stack)
                while stack:  
                    stack.pop()
                stack.append(s[i])

    if len(stack) > 0:
        # print(stack)
        # print(last_sub_str)
        # print(final_sub_str)
        for char_last_sub_str in last_sub_str[::-1]:
            if char_last_sub_str in stack:
                # print(1)
                break
            else:
                stack.insert(0, char_last_sub_str)
        if len(stack) >= len(final_sub_str):
            # print(2)
            final_sub_str = copy.deepcopy(stack)
            print(final_sub_str)
            return len(final_sub_str)
        else:
            # print(3)
            print(final_sub_str)
            # return len(final_sub_str)

比较有意思的是,在做这道题的时候,提交了好多次,每次都有新的输入对你产生阻碍。

因为队列有先进先出这一思想,找到当前最长的结果后就会把结果这些相关信息 “送走”,当你需要根据前面的字符去计算后面可能性最长的字符时,你的信息时丢失的。 如果有小伙伴看到这里不明白,可以先试着去理解代码。跑一些字符串检验下结果。尝试着理解下我说的问题。

LeetCode 给这道题有  987 个测试用例。

测试到549个例子  str_1 = "bpoiexpqhmebhhu" 时出现错误。报错,很有意思的事情,你的结果是这样的,按照上面的代码逻辑,这就是最好的结果了。

但是,leetcode给出的是

应该是我的逻辑缺失导致这个问题的产生。这里也留下一个以后的工作。继续按照队列的思想,去完善这个题的逻辑。

代码通过是按照暴力法解决的,代码很少也很明了:

def baoli(s):
    import copy
    length_str = len(s)
    print(length_str)
    final_sub_str = []
    temp_sub_str = []
    for i in range(length_str):
        print(i)
        for j in range(i,length_str):
            print("---{}{}".format(j,s[j]))
            if s[j] not in temp_sub_str:
                temp_sub_str.append(s[j])
            else:
                break
            print(temp_sub_str)
        if len(temp_sub_str) > len(final_sub_str):
            final_sub_str = copy.deepcopy(temp_sub_str)
        while temp_sub_str:
            temp_sub_str.pop()
            # print(final_sub_str)
    return len(final_sub_str)

结果:,很喜人,很暴力。结果很不理想。 tmd。

以后有时间还是回去提高用时和内存的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值