没错 又到了一周一篇文章的时候了,本周依旧其他知识没有系统总结,用 leetcode 题目水一篇。。。
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
题目看着短小,标着中等的难度,乍看好简单,然后就按照自己的思路撸了一版代码。
具体思路:记录同个字母上次出现的下标,与现坐标的相减,间隔最大的就是最长的字串。
func lengthOfLongestSubstring(s string) int {
l := 0
r := make(map[rune]int)
for i, v := range s {
tmp := i - r[v]
if tmp > l {
l = tmp
}
r[v] = i
fmt.Println(r)
}
return l
}
果然 too naive。。。 完全没有考虑到中间存在其他重复字母的情况(╥╯^╰╥)。 再一次被自己菜到了。
重新思考了下,利用go的strings包等各种便捷的func,用左右index记录当前字串情况(看了下题解,嗯咱专业点,滑动窗口),max记录最长字串,然后就过了(*^▽^*)
func lengthOfLongestSubstring(s string) int {
if len(s) == 0 {
return 0
}
left := 0
right := 1
max := 0
for i := right; i < len(s); i++ {
sub := s[left:right]
if !strings.Contains(sub, string(s[i])) {
if right - left > max {
max = right - left
}
right++
} else {
index := strings.Index(sub, string(s[i]))
left = left + index + 1
right++
}
}
return max+1
}