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

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

示例 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.无重复字符的最长子串)