算法1
(双指针算法) O(n)
i,j两个指针,当j指针大于1以后,i++,直到j指针所在的字符等于1
C++ 代码
class Solution {
public:
int longestSubstringWithoutDuplication(string s) {
unordered_map<char,int> hash;
int res=0;
for(int i=0,j=0;j<s.size();j++)
{
hash[s[j]]++;
while(hash[s[j]]>1)
{
hash[s[i++]]--;
}
res=max(res,j-i+1);
}
return res;
}
};
看懂了,
双指针plus,不错
简单易懂
请教一下这里时间复杂度怎么就是O(n)了呢? hash取值本身需要O(logn)吧。
而且以’abcdefghg’为例,当外层for循环遍历到第二个g的时候,内层的while循环需要遍历到第一个g才可以吧,所以单看for+while的循环模式应该就是O(n^2)了吧?
stl中的hash时间复杂度一般和元素个数有关,最多也就O(logn),也就8左右,如果感觉太慢,也可以开一个数组,这里之所有for+while是O(n)是因为无论是i或者是j都只会往前,不会后退,如果有下一个g的话,我们其实是从从第一个g之后开始的。
本题字符串取值一共就26个字母,开个数组的复杂度是O(1),哈希本身的复杂度与问题规模无关。
这里i后移是为了啥?没看明白
s[j]出现了两次,我们就要从当前的起点开始往后删除,直到再删除一次s[j],
牛逼!!!
这个是我看到最容易懂的,给你打call
清晰易懂!
给你打call