zoukankan      html  css  js  c++  java
  • leetcode3之无重复字符串的最长子串

    题目描述:

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

    示例 1:

    输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

    示例 2:

    输入: "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

    代码如下:

     1 def lengthofSubstring(s):
     2     '''
     3     返回最长的子字符串的长度
     4     :param s:
     5     :return:
     6     '''
     7     sub_len = []  # 记录子字符串长度
     8     for i in range(len(s)):  # 循环len(s)次,得到len(s)个子字符串
     9         temp_s = []  # 用来存放遍历过的字符
    10         count = 0  # 计录子字符串长度
    11         # 求每次的子字符串
    12         for ch in s[i:]:
    13             if ch not in temp_s:
    14                 temp_s.append(ch)
    15                 count += 1
    16             else:
    17                 break
    18         sub_len.append(count)
    19     print("sub_len=", sub_len)
    20 
    21     # if len(sub_len) == 0:
    22     #     return 0
    23     # else:
    24     #     return max(sub_len)
    25 
    26     return 0 if len(sub_len) == 0 else max(sub_len)
    27 
    28 
    29 print("-------------测试lengthofSubstring----------")
    30 s = "abcabcbb"
    31 l = lengthofSubstring(s)
    32 print("l=", l)
    33 
    34 
    35 def lengthOfsubstring(s):
    36     length = len(s)
    37     max_num, start, end = 0, 0, 0
    38     c_cache = set()
    39     while start < length and end < length:
    40         c = s[end]
    41         if c not in c_cache:
    42             c_cache.add(c)
    43             end += 1
    44             max_num = max(max_num, end - start)
    45         else:
    46             c_cache.remove(s[start])
    47             start += 1
    48     return max_num
    49 
    50 
    51 print("-------------测试lengthofSubstring----------")
    52 s = "abcabcbb"
    53 l = lengthOfsubstring(s)
    54 print("l=", l)
    55 
    56 
    57 def lengthofsubstring1(s):
    58     '''
    59     滑动窗口实现求取最长子字符串
    60     :param s:
    61     :return:
    62     '''
    63     left = 0
    64     sub_len = 0  # 记录子字符串的长度
    65     max_len = 0  # 记录子字符串的最大长度
    66     sub_set = set()  # 存储当前子字符串
    67     for i in range(len(s)):
    68         sub_len += 1
    69         while s[i] in sub_set:
    70             sub_set.remove(s[left])
    71             left += 1
    72             sub_len -= 1
    73         if sub_len > max_len: max_len = sub_len
    74 
    75         sub_set.add(s[i])
    76 
    77     return max_len
    78 
    79 
    80 print("-------------测试lengthofSubstring----------")
    81 s = "abcabcbb"
    82 l = lengthofsubstring1(s)
    83 print("l=", l)
    View Code

    输出:

    -------------测试lengthofSubstring----------
    sub_len= [3, 3, 3, 3, 2, 2, 1, 1]
    l= 3
    -------------测试lengthofSubstring----------
    l= 3
    -------------测试lengthofSubstring----------
    l= 3

    总结:重点讲解方法1和方法3。方法2是看到网友的解答,顺便也复制过来,没看大明白。

    方法1中。总体思想就是以字符串中每个字符作为子串开头,在该子串中找寻最大长度的子串并保存下来,最后比较各子串长度,返回最大数值即为最长字符串。那请问若还要返回最长的子串,该怎么修改代码?如何找寻最大长度子串呢?循环遍历该子串,若该元素已经出现过了,则循环终止,记录下已遍历过元素个数即为子串长度。

    方法3中。采用滑动窗口的思想来找寻最长字符串。比如abcabcbb字符串,第一次遍历a进入窗口,第二次b进入窗口,第三次c进入,第四次时因为a已经在窗口了,所以将字符串最左边元素移出,此时窗口子串为bca.继续循环。在循环过程中,记录下每次窗口元素长度sub_len,和max_len进行比较,若大于max_len ,更新。

  • 相关阅读:
    Thinkphp 模板中使用自定义函数的方法
    thinkphp 邮件发送
    str_replace使用
    SQL备份一张表的数据
    error: Allowed memory size
    LitJson使用
    implode,explode的使用
    ModelState.AddModelError使用
    HTTP 错误 404.2
    验证码显示不出来,在THINKPHP中的使用
  • 原文地址:https://www.cnblogs.com/rounie/p/13185052.html
Copyright © 2011-2022 走看看