美文网首页算法每日一刷工作生活
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