2018暑假第三题

本文提供了一道LeetCode经典题目——寻找给定字符串中最长不含重复字符子串长度的多种解法。包括了直接遍历检查、字符串排序以及利用字典进行高效查找的方法,并详细解释了每种方法的实现思路与局限性。

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

题目:

给定一个字符串,找出不含有重复字符的最长子串的长度。(python)

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列  而不是子串。

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/

方法一:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        str1 = []
        temp = 0
        x = 0
        
        for i in range(0,len(s)):
            for j in range(i,len(s)):
                if s[j] in str1:
                    x = len(str1)
                    break
                else:
                    str1.append(s[j])
                    x = len(str1)
            if x>temp:
                temp = x
                str1 = []
            else:
                str1=[]
        return temp

本方法无法提交。。。因为后面的测试时间比较长,超时了,但是结果是对的

方法二:

https://blog.youkuaiyun.com/together_cz/article/details/77533121   这个是下面代码的博客,我把他复制过来为了写注释

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        res_list=[]
        length=len(s)
        for i in range(length):
            tmp=s[i]
            for j in range(i+1, length):
                if s[j] not in tmp:
                    tmp+=s[j]
                else:
                    break
            res_list.append(tmp)
        res_list.sort(lambda x,y:cmp(len(x),len(y)))     //把res_list中的字符串按长短排序
        res = res_list[-1]                                               //取最长的一个
        return len(res)                                                  //返回其长度

这个是我在网上找的,但是,也是提交不上去,因为res_list[-1]报错:索引超出范围。。。明明可以运行。好气啊!
 

 

后来补充:

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        n = len(s)
        ans = 0
        dic = {}                                //创建一个空字典
        i = 0
        for j in range(n):                 
            if s[j] in dic:
                i = max(dic.get(s[j]),i)     //若字符已存在,则将子串的开头索引(i)向后移动
            ans = max(ans,j-i+1)        //子串长度取当前最长值
            dic[s[j]] = j+1                   //字典中键为字符串中的字母,值为该字符索引
        return ans
    这个代码是我把阅读解答里面的java代码改成python了,可以提交通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值