zoukankan      html  css  js  c++  java
  • LeetCode:最长不含重复字符的子字符串

    题目来源于 LeetCode 的第 3 题,难度为:中等。目前的通过率是37.3%。


    解题思路的思考:

      以abcabcbb为例,找出以每个字符结束,不包含重复字符的最长子串。那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:

    • 以 [a]bcabcbb 结束的最长字符串为[a]bcabcbb,长度为1
    • 以 a[b]cabcbb 结束的最长字符串为[ab]cabcbb,长度为2
    • 以 ab[c]abcbb 结束的最长字符串为[abc]abcbb,长度为3
    • 以 abc[a]bcbb 结束的最长字符串为a[bca]bcbb,长度为3
    • 以 abca[b]cbb 结束的最长字符串为ab[cab]cbb,长度为3
    • 以 abcab[c]bb 结束的最长字符串为abc[abc]bb,长度为3
    • 以 abcabc[b]b 结束的最长字符串为abcab[cb]b,长度为2
    • 以 abcabcb[b] 结束的最长字符串为abcabcb[b],长度为1

    有点动态规划的意思了,但是不是动态规划。
      我们每次找以x结尾的最长子串的时候,都是在上次的最长子串的基础上进行查找。比如在找以abcabcbb中的第4个a结尾的最长子串的时候,我们从上次的最长子串abc的基础上找。

     

     

    以此类推,每次找以x结尾的最长子串的时候,都是以x前面的那位最长子串的基础上找。比如,本例中的a前的那位是c,c的最长子串是abc。再次基础上开始我们确定以a结尾的最长子串:
    我们假定求以x结尾的最长子串,然后x前的那位结尾的最长子串是 #$%^

    找x上次出现的位置

    分2种情况:

    1、x不在上次的最长子串中,则以x结尾的最长子串就是#$%^x

    2、x在上次的最长子串中,则以x结尾的最长子串就是 %^x

    一直遍历到结束,返回最长的那个即可。

    代码

     class Solution {
        func lengthOfLongestSubstring(_ s: String) -> Int {
            if s.count == 0  { return 0 }
            var li = 0
            var si = 0
            var map = [Character:Int]()
            map[s.first!] = 0
            var maxLength = 1
            for (index,char) in s.enumerated() {
                if index == 0 { continue }
                li = map[char] ?? -1
                if li >= si {
                    si = li + 1
                }
                maxLength = max(maxLength, index - si + 1)
                map[char] = index
            }
            return maxLength
        }
    }

    代码解读
    li: lastIndex的缩写 ,表示:比如abcabcaa 现在到第4个位置也就是a ,li表示上次a出现的位置 li = 1

    si: startindex的缩写,表示以i-1位置字符结尾的最长不重复字符串的开始索引(最左索引) 比如abcabcaa 第三个位置的c,si =0

    map 存的就li的value,key 就是character

    结尾
      这个题其实有点动态规划的意思,要是有动态规划的基础,就可以很好的去解这道题。希望能帮助到大家。

    欢迎关注【无量测试之道】公众号,回复【领取资源】
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、
    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

    添加关注,让我们一起共同成长!

  • 相关阅读:
    Laravel 初始化
    ant design pro 左上角 logo 修改
    请求到服务端后是怎么处理的
    Websocket 知识点
    王道数据结构 (7) KMP 算法
    王道数据结构 (6) 简单的模式匹配算法
    王道数据结构 (4) 单链表 删除节点
    王道数据结构 (3) 单链表 插入节点
    王道数据结构 (2) 单链表 尾插法
    王道数据结构 (1) 单链表 头插法
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/15156720.html
Copyright © 2011-2022 走看看