原题链接Longest Substring Without Repeating Characters
意思是找到给定字符串最长的子串,注意,子串是在字符串中由连续的字符组成的,而子序列是通过删除若干字符得到的,二者要区分开
蛮力法自然是两层for循环搞定,但是效率堪忧,需要想办法将复杂度调整到O(n),也就是只遍历一遍字符串,这就需要记录在之前是否有遇到某个字符,可以使用unordered_map,不过这里因为仅仅是字符,那么创建一个大小为256的vector就可以了,反而显得节省空间。
细想,每个不包括重复字符的子串肯定是一段连续的字符区域,头设定为front,尾设定为back。那么在仅仅遍历一遍的情况下,front肯定是不断改变了,back则就是当前遍历到的位置
- 如果当前遍历到的这个字符在front后面没有出现过,那么front不需要移动,接着遍历后面的字符
- 如果当前遍历到的这个字符在front后面出现过,那么从front到当前位置这个子串肯定就有重复的字符了,此时就需要改变front的位置到出现的那个字符后面的位置。也就是和当前遍历到的这个字符上一次出现的位置的下一个位置。
- 在这个过程中,时刻更新最大的长度,因为front到back这段区域永远不可能有重复的字符,如果有,已经在第二步解决了</