这个题终于有了点新意,不是一套框架就出答案,不过反而更简单了,稍微改一改框架就行了:
// 滑动窗口算法框架——最长无重复子串 func lengthOfLongestSubstring(s string) int{ window := map[byte]int{} // go中无char.还有注意不能只声明,不创建 left := 0 right := 0 res := 0 // 记录结果 for right < len(s){ // c是将移入窗口的字符 c := s[right] // 右移窗口 right++ // 进行窗口内数据的一系列更新【重要】 window[c]++ // 判断左侧窗口是否要收缩 for window[c]>1{ // d是将一处窗口的字符 d := s[left] // 左移窗口 left++ // 进行窗口内数据的一系列更新【重要】 window[d]-- } // 在这里更新答案[重要] if res < right-left{ res = right -left } } return res }这就是变简单了,连 need 和 valid 都不需要,而且更新窗口内数据也只需要简单的更新计数器 window 即可。
当 window[c] 值大于 1 时,说明窗口中存在重复字符,不符合条件,就该移动 left 缩小窗口了嘛。
唯一需要注意的是,在哪里更新结果 res 呢?我们要的是最长无重复子串,哪一个阶段可以保证窗口中的字符串是没有重复的呢?
这里和之前不一样,要在收缩窗口完成后更新 res,因为窗口收缩的 while 条件是存在重复元素,换句话说收缩完成后一定保证窗口中没有重复嘛。
五、最后总结建议背诵并默写这套框架,顺便背诵一下文章开头的那首诗。以后就再也不怕子串、子数组问题了好吧。