题目
1 |
|
Related Topics: 字符串 滑动窗口
思路
惯例,首先思考一下暴力方法,是会超时还是爆内存,再考虑优化的方法。
暴力方法
遍历每一个字符ai,再往后遍历aj ( j > i ),如果存在aj = ak ( i ≤ k < j ),则比较之前长度的最大值并保存,maxLength = max(maxLength, j - i)
最坏的情况下,时间复杂度为O(n3)
优化
很显然,暴力算法做了很多重复工作,比如
abcabcbb
当找到第二个a的时候,我们已经知道这两个a之间的字符b
c
是没有重复的,所以不用再反复比较了。
自然而然会想到用滑动窗口的方式来优化。
1 | abcabcbb → abcabcbb → abcabcbb → abcabcbb |
用两个指针i和j,让j开始向后滑动,当出现j指向的内容与前面重复(即aj = ak ( i ≤ k < j ) ),则将i往后移动一位,在移动过程中j-i
的最大值就是答案。
但是关键是怎么快速判断是否重复,重新审题,字符都是ASCII码,所以可以构造一个长度为256的布尔数组(甚至128就够了),该字符的ASCII码数值则为索引,值用来标记是否已经访问过。
在j往后移动的过程中,将arr[a[j]]
设置为true;
在i往后移动的过程中,将前一位arr[a[i-1]]
设置为false
代码
1 | class Solution: |
如果大家有更好的解法,恳请不吝赐教,谢谢!