这道题暴力会超时,所以要想一些技巧。我的技巧是用一个map类型的变量mp存储所有字符串中曾经出现过的字符上一次出现的位置,同时记下当前无重复的子串的开始位置head。之后的步骤就是扫描整个string,如果当前位中字符没有出现过或者出现位置在head之前,那么就意味着当前位可以加入目前的子串;否则就说明当前位不能加入目前子串,当前无重复的子串开始位置就变为了当前字符上一次出现位置加一,同时字串长度也要减去字符上一次出现位置。当找到所有无重复子串后,就可以知道最长的无重复子串的长度了。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int Maxnum = 0;
int l = s.size();
map<char, int> mp;
mp.clear();
int num = 0, head = 0;
for (int i = 0; i < l; i++) {
if (!mp.count(s[i]) || mp[s[i]] < head) { //如果当前字符的上一次出现在此子串前,也就是不影响当前子串
num++;
} else {
num = i - mp[s[i]];
head = mp[s[i]] + 1;
}
mp[s[i]] = i;
Maxnum = max(Maxnum, num);
}
return Maxnum;
}
};