leetcode_无重复字符的最长子串

99 阅读1分钟

leetcode链接_无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
// 解法1
// 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
func lengthOfLongestSubstring(s string) int {
   var subStrMap = make(map[rune]int)
   var minIdx, maxIdx int

   var ret = 0
   for idx, c := range s {
      if i, exist := subStrMap[c]; exist {
         minIdx = i + 1

         //删除map中idx小于i的记录
         for k, v := range subStrMap {
            if v < i {
               delete(subStrMap, k)
            }
         }
      }
      subStrMap[c] = idx
      maxIdx = idx

      if maxIdx-minIdx+1 > ret {
         ret = maxIdx - minIdx + 1
      }
   }
   return ret
}

// 解法2
func lengthOfLongestSubstring2(s string) int {
   var subStrMap = make(map[uint8]int)

   var ret = 0

   for start, end := 0, 0; end < len(s); end++ {
      if idx, exist := subStrMap[s[end]]; exist {
         if idx >= start {
            start = idx + 1
         }
      }
      subStrMap[s[end]] = end
      if val := end - start + 1; val > ret {
         ret = val
      }
   }
   return ret
}