问题描述:给定一个字符串,找到最长的不含重复字符子串。例如,“abcabccc”最长不含重复字符的子串为“abc”,长度为3。对于“bbbbb”最长的子串为“b”,长度为1。
解决思路:“滑动窗口”,维护一个不包含重复字符“窗口”,从左到右扫描字符串,每当加一个新字符时,检查该字符是否存在于“窗口”中,如果不存在则将其添加进“窗口”,如果存在,则将“窗口”最左端到该字符之间的所有字符从该“窗口”中删除,在此过程中记录最大窗口长度。例如对于“abcabccc”当扫描到“abca”时将第一个“a”删掉得到“bca”。
int lengthOfLongestSubstring(string s)
{
if(s.size() == 0)
return 0;
unordered_map<char, int> imap; //窗口
int longest = 1;
int n = 0; //当前窗口大小
int left = 0; //窗口左边界
for(int i = 0; i < s.size(); ++i)
{
auto it = imap.find(s[i]);
if(it == imap.end())
{
++n;
imap.insert(make_pair(s[i], i));
}
else
{
longest = max(n, longest);
while(left <= it -> second)
{
imap.erase(s[left]);
++left;
}
imap.insert(make_pair(s[i], i));
n = imap.size();
}
}
longest = max(n, longest);
return longest;
}