题目(中等难度)
解答
暴力破解
核心思想:将给定字符串的所有子字符串都列出来,然后对每个字符串进行元素重复判断。
假如给定的字符串长度是n,那么本字符串的所有可能子串个数为
以第一个字符开头的子串个数为: n
以第二个字符开头的子串个数为: n-1
..
以最后一个字符开头的子串个数为: 1
所以总共的子串个数为 1 + 2 + … + (n - 1) + n;
可以看到上面是一个等差数列求和,结果为:
实现代码:
|
复杂度:
获取所有子字符串的时间复杂度是O(nn)
遍历每个子串的时间复杂度为O(nnn)
空间复杂度为:O(n n) 需要一个n*n的数组保存所有的子串
上面代码可以进一步优化,将保存子串的数组去掉,获取到子串时,直接进行重复校验即可。空间复杂度变为O(n)
滑动窗口
定义两个指针[i, j],分别界定窗口的左右区间。窗口大小为size=j-i+1;
初始时:i,j都指向第一个元素,窗口大小为0
接着滑动窗口的右边界,获取一个校验元素m
如果m在窗口中不重复,则将其添加到窗口m,否则调整窗口,将窗口左边界移动到窗口与校验元素的后一个元素。
重复上面过程,直至数组中所有元素都遍历完毕。
case1:
输入:”dvdf”
输出:3
最长子串: “vdf”
执行过程:
case2:
输入:”dddd”
输出:1
最长子串: “d”
执行过程:
case3:
输入:”d”
输出:1
最长子串: “d”
实现代码:
|
复杂度:
最外层要对字符串进行完全遍历,循环内部需要对窗口进行重复判断。所以时间复杂度为O(n*n)
由于整个计算过程只用到了matLen一个变量,所以空间复杂度为O(1)