003_无重复字符的最长子串

知识点:滑动窗口

LeetCode第三题:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

实现语言:GoLang

// 滑动窗口, 优化版,减少left的移动次数
func lengthOfLongestSubstring(s string) int {
	length := len(s)
	window := map[uint8]int{}

	max := 0
	left, right := 0, 0
	for right < length {
		c := s[right]

        // 关键一步:如果发现已经存在该字符,那么直接将新的left更新到这里,丢弃掉前一个相同字符的位置
		if n, ok := window[c]; ok && n >= left {
			left = n + 1
		}

        if right - left + 1 > max {
            max = right - left + 1
        }

		window[c] = right
		right++
	}
	if right - left > max {
		max = right - left
	}

	return max
}


// 滑动窗口解法
func lengthOfLongestSubstring_(s string) int {
	length := len(s)
	window := map[uint8]int{}

	max := 0
	left, right := 0, 0
	for right < length {
		c := s[right]
		window[c]++

		for window[c] > 1 {
			if right - left > max {
				max = right - left
			}

			d := s[left]
			window[d]--
			left++
		}
		right++
	}
	if right - left > max {
		max = right - left
	}

	return max
}
posted @ 2020-02-29 20:53  Cenyol  阅读(71)  评论(0编辑  收藏  举报