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

    题目:无重复字符的最长子串。

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

    示例 1:

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

    输入: “bbbbb”
    输出: 1
    解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
    示例 3:

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

    解法思路:

      初始化一个 哈希表字典  dic

    头指针start 初始为0

    当前指针 cur 初始为0

    最大长度变量 l 初始为0

      用cur变量从给定字符串str的开头开始 一位一位的向右查看字符,直到整个字符串遍历完, 对每一位字符进行如下:

        当前位置的字符为 c = str[cur]

        查询当前字符 c 是否 在哈希表dic的键 当中,表示 当前字符c 是否之前遍历到过

           如果 当前字符还没出现过,就 在dic中记录一个键值对  (当前字符c,当前位置cur )

          cur 后移一位

           如果 当前字符出现过, 获取 当前字符串c 上次出现的位置 pre = dic[c]

          如果pre 在 start后面即 pre>start, 则把start 移动到 pre的下一位, start = pre + 1, 这样保证cur继续向后遍历中 从start到cur没有重复元素

          否则 start不动,start移动到某一个位置,说明在这个位置之前有重复的元素了,所以start只往后移动不往回移动

        这时候在衡量一下  如果 cur - start + 1 (衡量当前没重复子串开头到结尾的长度) 比 长度变量 l 大, 那就替换 l 为  cur - start + 1

    代码:

    class Solution:
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            l = 0
            start = 0
            dic = {}
            for i in range(len(s)):
                cur = s[i]
                if cur not in dic.keys():
                    dic[cur] = i
                else:
                    if dic[cur] + 1 > start:
                        start = dic[cur] + 1
                    dic[cur] = i
                if i - start + 1 > l:
                    l = i - start + 1
    
            return l
  • 相关阅读:
    Codeforces 931A&1312A&172A
    STL常用容器(deque&stack&queue)
    Codeforces 141A&1368A
    Tensorflow安装和配置
    Spark高可用配置
    Spark安装及环境配置
    SSH免密登录
    大数据集群linux环境搭配
    Spark学习之RDD算子
    Spark学习之再谈RDD
  • 原文地址:https://www.cnblogs.com/tsdblogs/p/12311130.html
Copyright © 2011-2022 走看看