美文网首页
Leetcode Meet Me算法学习:3.无重复字符的最长子

Leetcode Meet Me算法学习:3.无重复字符的最长子

作者: Q海龙 | 来源:发表于2019-07-11 10:48 被阅读0次

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

    示例 1:

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

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

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


    func lengthOfLongestSubstring(_ s: String) -> [String] {
        guard s.count > 1 else {
            return [s]
        }
        //存储旧的最长字符
        var arr = [String]()
        var tmp = [String]()
        var index = 0
        while index < s.count {
            let startIndex = s.index(s.startIndex, offsetBy: index)
            let endIndex = s.index(s.startIndex, offsetBy: index + 1)
            let subString = s[startIndex ..< endIndex]
            let str = String(subString)
            index += 1
            
            if tmp.contains(str) == true {
                let i = tmp.firstIndex(of: str)!
                //出现了重复字符,与旧的相比,如果比旧的长则替换,比旧的短则不变
                if arr.count < tmp.count {
                    arr = tmp
                }
                //删除<=重复位置的字符
                let range = Range(NSRange(location: 0, length: i + 1))!
                tmp.removeSubrange(range)
            }
            //添加新的b字符
            tmp += [str]
        }
        //循环结束后,再与旧的对比一次,选出最长的返回
        if arr.count < tmp.count {
            arr = tmp
        }
        return arr;
    }
    
    //let arr = lengthOfLongestSubstring("abcabcbb")
    //let arr = lengthOfLongestSubstring("bbbbb")
    let arr = lengthOfLongestSubstring("pwwkew")
    print("arr: \(arr)\ncount: \(arr.count)")
    

    相关文章

      网友评论

          本文标题:Leetcode Meet Me算法学习:3.无重复字符的最长子

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