最长不含重复字符的子字符串

103 阅读1分钟

leetcode地址

func lengthOfLongestSubstring(_ s: String) -> Int {
    if s.count == 0 { return 0 }
    //使用-1填充避免和第0位字符冲突,128种字符
    var dp = Array(repeating:-1,count:128)
    
    let s = Array(s)
    var res = 0,i = 0
    
    //i到j 为没有重复字符的字符串 , res记录出现过的最大长度
    //dp[t] 为记录的最后一个出现的s[j]的位置
    for j in 0 ..< s.count {
        let t = Int(s[j].unicodeScalars.first!.value)
        
        // j必定 >= i , dp[t] < i 表示在 i和j之间没有出现过s[j]
        if dp[t] < i {
            //i到j没有重复字符,更新res
            res = max(res,j-i+1)
        }else{
            // i和j之间出现过s[j],i挪到d[t]之后一位
            i = dp[t] + 1
        }
        //记录为值为j的字符最后一次出现的位置
        dp[t] = j
    }
    return res
}