Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
最简单的做法就是用一个嵌套循环遍历,但是这样效率比较低。我采取的做法是用一个map来记录substring,遍历string,如果该字符没有出现在map中,那就将其加入map,若出现过,说明该字符有重复,则将第一个字符从map中去除,重新检测当前字符是否出现在map中,重复此过程直到map中没有该字符,每次此过程都更新记录substring的最大长度。这样操作只需要遍历string一遍,比嵌套循环要好很多。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char, int> str;
int start = 0, len = 0; //start表示当前str第一个字符在s中的位置
for (int i = 0; i < s.length(); i++) {
if (str.find(s[i]) != str.end()) { // 如果当前字符出现在str中,将第一个字符从str中去除
if (str.size() > len) {
len = str.size();
}
str.erase(str.find(s[start]));
start++;
i--;
} else { // 如果该字符没有出现在str中,那就将其加入str
str[s[i]] = i;
}
}
if (str.size() > len) {
len = str.size();
}
return len;
}
};