leetCode之Longest Substring Without Repeating Characters实现

3 Longest Substring Without Repeating Characters

  • 要求:
    Given a string, find the length of the longest substring without repeating characters.
    Examples:
    Given “abcabcbb”, the answer is “abc”, which the length is 3.
    Given “bbbbb”, the answer is “b”, with the length of 1.
    Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.
  • 题目大意:给定一个字符串,找出其中最长的子符串,这个字符串中不能出现重复的字符。

3.1 暴力法

  • 解题思路:定义一个空的列表dict和定义两个指针i,j,指针i遍历原始的字符串,指针j遍历子字符串。当i不在dict中时,i被添加到dict中,如果i在dict中,指针j从dict中第一个字符开始搜索,当找到dict中与i相等的字符时,更新dict。此时更新有两种方式,具体参考代码
  • 时间复杂度:O(n2
  • 运行结果:耗时166ms
class Solution:
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        耗时166ms
        复杂度O(n2)
        """
        dict = []
        lens = 0
        for i in s:
            if not(i in dict):
                dict.append(i)
            else:
                for j in range(len(dict)):
                    if dict[j] == i:
                        if j == len(dict)-1:
                            dict = []
                            dict.append(i)
                        else:
                            dict = dict[j+1:]
                            dict.append(i)
                            break
            if lens < len(dict):
                lens = len(dict)
        return lens

3.2 使用python自带的index方法

  • 解题思路:在上面的代码中发现,当i在dict中,要遍历所有的dict,然后找到与i相等的字符,想着如果有一个函数可以直接返回dict与i相等字符的索引就好了,于是就找到了index,但是结果表明,该系统函数使用的算法并不是很好。
  • 时间复杂度O(n2
  • 运行结果:206ms
class Solution:
   def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        耗时206ms
        """
        dict = []
        lens = 0
        for i in s:
            if not(i in dict):
                dict.append(i)
            else:
                inx = dict.index(i)  # 特别慢
                if inx == len(dict)-1:
                    dict = []
                    dict.append(i)
                else:
                    dict = dict[inx+1:]
                    dict.append(i)
            if lens < len(dict):
                lens = len(dict)
        return lens

3.3 动态窗口

  • 解题思路:定义两个指针left和right。首先两个指针都指向string的第一个字符,当right指向的字符不在s[left:right]之间时(注意[left:right]并不包含右区间,所以刚开始[left:right]为空[])。right++,否则遍历s[left:right]这个子区间。这里需要注意的是,遍历这个子区间后,left要再加1。因此加1之前left指向的是s[left]=s[right]。此时right也要加1。最终更新lens。
  • 时间复杂度:O(n)
  • 运行结果:139ms
class Solution:
    def lengthOfLongestSubstring3(self, s):
        """
        :type s: str
        :rtype: int
        耗时139
        """
        lens = 0
        left = 0
        right = 0
        while right < len(s):
            if not(s[right] in s[left:right]):
                right += 1
            else:
                while s[left] != s[right]:
                    left += 1
                left += 1
                right += 1
            if lens < right - left:
                lens = right - left
        return lens
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值