Solution 1 – Last seen position
func lengthOfLongestSubstring(s string) int {
// use sliding window
// check range using left right pointer
// maintain freq of each char, if >1 move left pointer at that pos +1
// right keeps moving with the loop
// max length is difference between left and right
var maxLen, left, right int
var char int32
seenAt := make(map[int32]int)
for right, char = range s {
if at, seen := seenAt[char]; seen && at >= left {
left = at + 1
}
seenAt[char] = right
maxLen = max(maxLen, right-left+1)
}
return maxLen
}

Solution 2 – Similar but using frequency count
func lengthOfLongestSubstring(s string) int {
var left,right,maxLen int
freqSeen := make(map[int32]int)
var char int32
for right,char = range s {
freqSeen[char]+=1
if _,seen:= freqSeen[char];seen{
for freqSeen[char]>1{
freqSeen[int32(s[left])]-=1
left+=1
}
}
maxLen=max(maxLen,right-left+1)
}
return maxLen
}

Leave a Reply