無重復(fù)字符的最長子串

題目描述

給定一個字符串,找出不含有重復(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

        }
    }

這段代碼在LeetCode中測試未通過,把LeetCode未通過的測試案列放到本地測試,卻又是通過的。所以呢,代碼有沒有問題,我也不知道啊╮(╯▽╰)╭,如果你找到問題了,請告訴我了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容