天天看點

LeetCode:最長不含重複字元的子字元串

題目來源于 LeetCode 的第 3 題,難度為:中等。目前的通過率是37.3%。

LeetCode:最長不含重複字元的子字元串

解題思路的思考:

  以abcabcbb為例,找出以每個字元結束,不包含重複字元的最長子串。那麼其中最長的那個字元串即為答案。對于示例一中的字元串,我們列舉出這些結果,其中括号中表示選中的字元以及最長的字元串:

  • 以 [a]bcabcbb 結束的最長字元串為[a]bcabcbb,長度為1
  • 以 a[b]cabcbb 結束的最長字元串為[ab]cabcbb,長度為2
  • 以 ab[c]abcbb 結束的最長字元串為[abc]abcbb,長度為3
  • 以 abc[a]bcbb 結束的最長字元串為a[bca]bcbb,長度為3
  • 以 abca[b]cbb 結束的最長字元串為ab[cab]cbb,長度為3
  • 以 abcab[c]bb 結束的最長字元串為abc[abc]bb,長度為3
  • 以 abcabc[b]b 結束的最長字元串為abcab[cb]b,長度為2
  • 以 abcabcb[b] 結束的最長字元串為abcabcb[b],長度為1

有點動态規劃的意思了,但是不是動态規劃。

  我們每次找以x結尾的最長子串的時候,都是在上次的最長子串的基礎上進行查找。比如在找以abcabcbb中的第4個a結尾的最長子串的時候,我們從上次的最長子串abc的基礎上找。

LeetCode:最長不含重複字元的子字元串
LeetCode:最長不含重複字元的子字元串
LeetCode:最長不含重複字元的子字元串

以此類推,每次找以x結尾的最長子串的時候,都是以x前面的那位最長子串的基礎上找。比如,本例中的a前的那位是c,c的最長子串是abc。再次基礎上開始我們确定以a結尾的最長子串:

我們假定求以x結尾的最長子串,然後x前的那位結尾的最長子串是 #$%^

找x上次出現的位置

分2種情況:

1、x不在上次的最長子串中,則以x結尾的最長子串就是#$%^x

2、x在上次的最長子串中,則以x結尾的最長子串就是 %^x

一直周遊到結束,傳回最長的那個即可。

代碼

class Solution {
    func lengthOfLongestSubstring(_ s: String) -> Int {
        if s.count == 0  { return 0 }
        var li = 0
        var si = 0
        var map = [Character:Int]()
        map[s.first!] = 0
        var maxLength = 1
        for (index,char) in s.enumerated() {
            if index == 0 { continue }
            li = map[char] ?? -1
            if li >= si {
                si = li + 1
            }
            maxLength = max(maxLength, index - si + 1)
            map[char] = index
        }
        return maxLength
    }
}      

代碼解讀

li: lastIndex的縮寫 ,表示:比如abcabcaa 現在到第4個位置也就是a ,li表示上次a出現的位置 li = 1

si: startindex的縮寫,表示以i-1位置字元結尾的最長不重複字元串的開始索引(最左索引) 比如abcabcaa 第三個位置的c,si =0

map 存的就li的value,key 就是character

結尾

  這個題其實有點動态規劃的意思,要是有動态規劃的基礎,就可以很好的去解這道題。希望能幫助到大家。

歡迎關注【無量測試之道】公衆号,

Python程式設計學習資源幹貨、

Python+Appium架構APP的UI自動化、

Python+Selenium架構Web的UI自動化、

Python+Unittest架構API自動化、

文章下方有公衆号二維碼,可直接微信掃一掃關注即可。

備注:我的個人公衆号已正式開通,緻力于測試技術的分享,包含:大資料測試、功能測試,測試開發,API接口自動化、測試運維、UI自動化測試等,微信搜尋公衆号:“無量測試之道”,或掃描下方二維碼: