描述:给一个字符串s,找到它的最长子串(无任何字符重复)substring的长度。
举例:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", which the length is 3.
思路:
我的做法是从左至右扫描,设repeat[c],记录字符c上一次在字符串s中出现的位置。假设现在正在扫描s[j]字符,而之前已经记录s[i,j-1]都未出现任何重复字符。假设检测到s[j]上一次出现的位置repeat[j]在区间[i,j-1]内,那么可以截取子串s[i,j-1]并与当前smax做优选。接着我们可以从repeat[j]开始,更新区间为s[repeat[j]+1,j]并继续向后扫描处理。
官方的思路其实跟我的一致,不过叙述上有所差别。它提出了滑动窗口SliddingWindow的概念,并且使用HashSet存储窗口P[i,j)内的所有未重复字符。当发现s[j]在HashSet中重复时就要动态更新窗口下限i,尽可能大地向右滑动。详见:https://leetcode.com/problems/longest-substring-without-repeating-characters/solution/