美文网首页算法每日一刷工作生活
LeetCode算法题-3. 无重复字符的最长子串(Swift)

LeetCode算法题-3. 无重复字符的最长子串(Swift)

作者: entre_los_dos | 来源:发表于2019-07-01 13:24 被阅读0次

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

题目

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

示例 1:

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

示例 2:

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

示例 3:

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

记住没有重复字段的第一个index和当前的index,算长度。有重复字段出现后,更新第一个index。

方法1-用for i in 0..<s.count,结果超时

func lengthOfLongestSubstring(_ s: String) -> Int {
        
        var maxLen = 0
        var characters = [Character:Int]()
        var firstIndex = 0 //从哪里开始算长度,如果有重复的就从重复的后一位开始算
        
        //遍历字符串,遍历过的,将字符处于第几位保存在字典中。
        //如果字典里面有。firstIndex = 上一次出现这个字符index
        //当前-firstIndex
        for i in 0..<s.count {
            
            let currentCharacter = s[s.index(s.startIndex, offsetBy: i)]

            if characters[currentCharacter] != nil {
                //
                let beforeIndex = characters[currentCharacter]!
                firstIndex = max(beforeIndex, firstIndex)
            }
            
            maxLen = max(i + 1 - firstIndex, maxLen)

            characters[currentCharacter] = i+1
        }
        return maxLen
    }

方法2-for currentCharacter in s。通过

func lengthOfLongestSubstring(_ s: String) -> Int {
        
        var maxLen = 0
        var characters = [Character:Int]()
        var firstIndex = 0 //从哪里开始算长度,如果有重复的就从重复的后一位开始算
        var currentIndex = 0

        //遍历字符串,遍历过的,将字符处于第几位保存在字典中。
        //如果字典里面有。firstIndex = 上一次出现这个字符index
        //当前-firstIndex
        
        for currentCharacter in s {
            
            if characters[currentCharacter] != nil {
                //
                let beforeIndex = characters[currentCharacter]!
                firstIndex = max(beforeIndex, firstIndex)
            }
            
            maxLen = max(currentIndex + 1 - firstIndex, maxLen)

            characters[currentCharacter] = currentIndex+1
            currentIndex += 1
        }
        return maxLen
    }

相关文章

网友评论

    本文标题:LeetCode算法题-3. 无重复字符的最长子串(Swift)

    本文链接:https://www.haomeiwen.com/subject/tnpicctx.html