題目描述
給定一個字符串,找出不含有重復(fù)字符的最長子串的長度。
示例
給定 "abcabcbb" ,沒有重復(fù)字符的最長子串是 "abc" ,那么長度就是3。
給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。
給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是一個子串,"pwke" 是 子序列 而不是子串。
分析
創(chuàng)建一個指針start, 用于記錄當(dāng)前子串的開始索引位置,當(dāng)出現(xiàn)重復(fù)字符的時候,就需要把這個指針移動到上一次該字符出現(xiàn)的 index + 1的位置,作為新的開頭,那么在之前的字符就應(yīng)該舍棄了,所以需要判斷一下,每次取得字符是不是在start之后的。
創(chuàng)建一個參數(shù)subMax,用于記錄當(dāng)前子串的長度
創(chuàng)建一個用于存放字符最后出現(xiàn)的索引位置的字典,key是字符,value是字符的索引,需要更新字符最后出現(xiàn)的索引
代碼如下:
func lengthOfLongestSubstring(_ s: String) -> Int {
if s.count == 0 {
return 0
}else{
var start = 0 //當(dāng)前子串的位置
var max = 0 //記錄當(dāng)前
var subMax = 0
var namesOfIntegers = [Character: Int]()
for (index, value) in s.enumerated(){
//如果檢索位置的字符第二次出現(xiàn),記錄當(dāng)前的子串的長度,然后將start移動到之前重復(fù)字符的索引+1的位置,記錄此時的長度,在下次遇到重復(fù)的字符的時候,再次比較長度
if namesOfIntegers.keys.contains(value) && namesOfIntegers[value]! >= start{
max = max > subMax ? max : subMax
start = namesOfIntegers[value]! + 1
subMax = index - start + 1
}else{
subMax += 1
}
namesOfIntegers[value] = index //將為重復(fù)的字符序號放入字典
}
return max > subMax ? max : subMax
}
}