LeetCode_0003 无重复的最长子串 Python

LeetCode第三题,求无重复的最长子串,这题比较简单。不多说,直接上题。

这一题题目的提示里有提到空格,但我觉得空格也算字符,毕竟空格还有ASCII码呢,ASCII码值为32,这个考试可能会考到的。

不多说,上代码:

def solution(origina_str):
    # 一个字符串类型的变量存放最长子串。
    max_sub_str = ""
    # 循环获取所有字串
    for i in range(len(origina_str)):
        for j in range(i + 1, len(origina_str) + 1):

            set_1 = set()
            # 字符串切片后的子串。
            sub_str = origina_str[i:j]

            # 将子串的每个字符存入集合,利用集合的无重复性,重复的字符不会再存。
            for k in sub_str:
                set_1.add(k)
            # 如果集合长度不等于字串长度,则表示有重复字符,直接舍弃。
            # 而且因为已经有重复字符,后面的子串也一定会有。
            if len(set_1) != len(sub_str):
                break
            else:
                # 取最长子串
                if len(sub_str) > len(max_sub_str):
                    max_sub_str = sub_str

    return len(max_sub_str)

老样子,两层for循环,第一层控制子串的头,第二层控制子串的尾,j从i之后开始寻找,获取子串的时候需要用到字符串切片,这个可以自己上网查资料。创建一个集合set_1,因为集合是无重复的,找到的子串,将字符一个个往集合里放,就能检验出来是否有重复字符。

举个例子:假如子串是Hello,用字符串表示就是str = "Hello",如果把这些个字符统统放入集合中,那么集合里面可能是这样一种情况:set = {"e", "H", "l", "o"},因为集合是无序的嘛。这样,集合的长度就是4,字符串的长度就是5,一比较,集合小了。那就表示有重复的字符。

找出来一个无重复字符就可以跟当前最长的无重复字符比较,更长的话就替换,否则就不管他,执行下一轮。

这是我测试的样子:

# 初始字符串
str_1 = "a w2afo an1 1ofn1a"
# 初始空列表,存放筛选出来的无重复子串
print(solution(str_1))

结果是这样:

6

如果想知道求得的最长子串是哪一串的话,在函数的return前面加上print就行:

 w2afo
6

注意:空格也是字符,他的ASCII码是32!!!

最后,我写的时候没看答案,这串代码肯定是比答案垃圾,仅做启发编程思维使用,如果出现Bug还请指正。

如果这篇文章对你有帮助的话,就点个赞吧,谢谢啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子串问题。 方法一是使用扩展中心法优化,即从左向右遍历字符串,找到连续相同字符组成的子串作为扩展中心,然后从该中心向左右扩展,找到最长的回文子串。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符串,判断子串是否是回文子串,然后得到最长回文子串。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子串问题的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子串](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子串](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5题:最长回文子串Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你算哪根小辣条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值