题意
求一个字符串的最长连续不重复子串
思路
解法一
暴力,两层循环枚举起点和终点,一层循环判断这段字符串中是否存在重复的字符,时间复杂度
O(n3)
解法二
尺取法,设置左右两个指针,右指针不断向前移动直到出现重复的字符,出现重复字符之后,左指针开始前进,直到找到那个重复的字符并越过,然后继续,中间记录最长的连续不重复子串长度,时间复杂度
O(n)
解法三
使用一个
hash
表记录当前寻找的序列的起点,以字符为
key
,
value
为所处位置,如果发现当前遍历字符在
hash
表中,更新起点,中间不断的进行长度的检查.注意:初始化
hash
表中每个
key
的
value
都要为-1,因为我们下次取得起点为
value+1
结果
Your runtime beats 33.07% of cpp submissions.
代码
解法二:
class Solution {
public:
map<int, int>vis;
int lengthOfLongestSubstring(string s) {
vis.clear();
int l = 0;
int r = 0;
int len = s.length();
int cnt = 0;
int ans = 0;
while(1){
int flag = 0;
if(cnt != 0){
cnt--;
vis[s[r] - 'a']--;
}
while(flag == 0 && r < len){
if(vis[s[r] - 'a'] != 0){
vis[s[r] - 'a']++;
flag = 1;
break;
}
vis[s[r] - 'a'] = 1;
r++;
cnt++;
}
ans = cnt > ans ? cnt : ans;
if(l >= r || flag == 0){
break;
}
while(flag != 0 && l <= r){
if(vis[s[l] - 'a'] != 1){
flag = 0;
}
vis[s[l] - 'a']--;
l++;
if(flag != 0)
cnt--;
}
}
return ans;
}
};
解法三:
class Solution {
public:
int mp[300];
int lengthOfLongestSubstring(string s) {
int len = s.length();
int startLoc = -1;
int ans = 0;
for(int i = 0; i < 300; i++){
mp[i] = -1;
}
for(int i = 0 ; i < len; i++){
startLoc = max(startLoc, mp[s[i]] + 1);
mp[s[i]] = i;
ans = max(ans, i - startLoc + 1);
}
return ans;
}
};