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

pardon110發表於2020-10-12

題面

請從字串中找出一個最長的不包含重複字元的子字串,計算該最長子字串的長度。
示例

輸入: "pwwkew"
輸出: 3

解釋: 因為無重複字元的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,”pwke” 是一個子序列,不是子串。

來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/zui-chang...

分析

  • 滑動視窗
  • 雙指標
  • 雜湊對映

上碼

  • 雜湊檢測到是否有相同值
  • 無重複值,當前字元收錄入雜湊,右指標擴張
  • 有則,右指標等待擴大邊界,左指增長,同時雜湊收縮
  • 重複直到同值左側耗盡,一輪迴圈時記錄最大長度,本質 字典模擬雙端佇列
func lengthOfLongestSubstring(s string) int {
    maxLen := 0
    m := make(map[byte]struct{},0)
    for left,right := 0,0; right < len(s); {
        if _,ok := m[s[right]];ok {
            delete(m, s[left])
            left++
        }else{
            m[s[right]] = struct{}{}
            right++
        }
        if right - left > maxLen {
            maxLen =  right - left
        }
    }
    return maxLen
}

小結

迴圈體內自增,可讓邊界在迴圈體內參與計算,合理避免越界
同佇列,棧一樣,雜湊變數動態擴張與收縮,可作為臨時輔助工具參與

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章