题目描述:
Given a string, find the length of the longest substring without repeating characters.
样例:
1 | Input: "abcabcbb" |
1 | Input: "bbbbb" |
1 | Input: "pwwkew" |
题意:
给你一个字符串 s,找出最长无重复子串,注意,这里是子串,不是子序列。
思路:
因为是找无重复的子串,那么该怎么找呢?蚊子首先就是要一个个字符依次遍历查找
就比如第一个样例:”abcabcbb”
一个个遍历查找首先会找到:”a”, “b”, “c”,此时的子串为 “abc”,长度为 3;
再往后遍历的时候就会查找到 “a”
这时我们发现已经有一个 “a” 了,因为 “a” 就在之前查找的子串之后,并且替换之后长度未发生改变,那我们将这一个新的 “a” 替换原来的 “a”,此时新的子串为 “bca”,长度为 3;
再往后遍历,查找到了 “b”
同样,我们发现原本的子串中已经有一个 “b” 了,并且 “b” 同样在原本的子串之后,长度也没有发生改变,就将新的位置上的 “b” 替换之前的 “b”,此时新的子串为 “cab”;
之后遍历得到的 “c”,同理,这是子串为 “abc”,长度为 3;
再之后遍历得到的 “b”,我们发现子串中已经有一个 “b” 了,同样操作,我们替换之前的 “b”,并且此时子串为 “bc”,长度为 2;
当遍历到最后一个 “b” 时,一样操作并替换,子串为 “b”,长度为 1;
总结:
在上面的描述过程中,我们可以发现,在查找最长无重复的子串时,就相当于一个滑动窗口,在这个滑动窗口里面的字符,是一定没有重复字符的,而我们在每次遍历替换的时候,都会检查加进来的字符,是否重复:若没有重复,那么直接加进滑动窗口;反之,则更新替换。
下面是我刚刚写过的代码:
1 | class Solution { |
Runtime:40ms Memory:16.5MB
faster than 41.34%
康了一下网友的题解,比我的快了两倍的样子,太强啦,ORZ~1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
int size=s.size();
int table[256];
for(int i=0;i<256;i++)
{
table[i]=-1;
}
int ret=0;
int currtL=0;
int currtR=size-1;
for(int i=0;i<size;i++)
{
if(table[s[i]]!=-1)
{
int preIdx=table[s[i]];
if(preIdx>=currtL)
{
int tmp=i-currtL;
if(tmp>ret)
{
ret=tmp;
}
currtL=preIdx+1;
if(size-currtL<=ret){break;}
}
}
table[s[i]]=i;
}
if(ret<currtR-currtL+1)
{
ret=currtR-currtL+1;
}
return ret;
}
};
Runtime:24ms Memory:14.7MB
faster than 77.12%