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

示例 1:

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

示例 2:

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

解题思路使用注释标注的很详细

方法1

    func lengthOfLongestSubstring(_ s: String) -> Int {
         var maxCount = 0
        var currCount = 0
        var subString = ""
        for a in s {
            if subString.contains(a) {
                //如果包含则从当前该字符的postion开始计算
                let range = subString.range(of: String(a))
//                subString = String(subString.suffix)
                subString = String(subString[(range?.upperBound)!.. maxCount {
                maxCount = currCount
            }
        }
        return maxCount
    }

方法2 (更优)

    func lengthOfLongestSubstring(_ s: String) -> Int {
        if s.count <= 1 {
            //如果小于一个字符 直接返回
            return s.count
        }
        
        var ans = 1 //最大长度, 默认为1
        var sta = 0 //起始位置
        var had = false //是否遇到过重复字符, 如果遇到重新判断一次最大长度
        var cache : [Character : Int] = [:]
        var i = 0 //遍历下标
        
        for c in s {
            //遍历字符串 c为字符类型
            if let temp = cache[c] {
                //如果遇到重复字符
                had = true
                //保留最大的起始位
                sta = max(temp, sta)
                print(sta)
                ans = max(ans, i-sta)
            } else{
                //不是重复字符
                if !had, i > 0 {
                    //一直没遇到过重复字符执行该分支  直接+1
                    //如果遇到过重复字符之后, 则该分支不会被执行
                    ans += 1
                } else {
                    //获取最大长度
                    ans = max(ans, i-sta)
                }
            }
            //保存最新位置
            cache[c] = i
            i += 1
        }
        return ans
    }

你可能感兴趣的:(给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。)