題目:
給定一個字符串缤言,請你找出其中不含有重復字符的 最長子串 的長度。
- 示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3妓湘。
- 示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b"虱疏,所以其長度為 1力试。
- 示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是 "wke",所以其長度為 3骏融。
請注意链嘀,你的答案必須是 子串 的長度,"pwke" 是一個子序列档玻,不是子串驹碍。
答案:
class Solution {
func lengthOfLongestSubstring(_ s: String) -> Int {
if s.count == 0 {
return 0
}
// 創(chuàng)建一個字典緩存字符和該字符的相對位置
var dic = Dictionary<Character, Int>()
// 最大子串的長度
var maxLength = 0
// 當前字符位置
var index = 0
// 新子串的開始位置
var startIndex = 0
for ch in s {
if let i = dic[ch] {
// 出現重復啦初嘹,記錄重復的字符的下一個位置(因為矛物,dic存的就是下一個位置)
// 該位置作為新的子串起始點
startIndex = max(i, startIndex)
}
// 先 加1
index += 1
// 這個字符對應的值蓬抄,就是這個字符的下一個位置
dic[ch] = index
// index - startIndex 意思是,新子串的長度
maxLength = max(maxLength, index - startIndex)
}
return maxLength
}
}