// :给一个字符串,获得没有重复字符的最长子字符的长度
int GetLongStr(string str)
{
map<char, int> charMap;
int maxLen = 0;
int winLeft = 0;
for (int i = 0; i < str.size(); i++) {
if (charMap.find(str[i]) != charMap.end()) {
// 这里很重要!!!,必须是左边窗口winLeft和i处字符的上一次出现的位置的比较
winLeft = max(winLeft, charMap[str[i]]); // 更新窗口左边的索引。
}
maxLen = max(maxLen, i - winLeft);
charMap.insert(make_pair(str[i], i));
}
return maxLen;
}
int main() {
cout << GetLongStr("abcabrs");
return 0;
}
其中:
1)窗口是滑动的、可变长度的。每当发现重复字符时,舍弃最左边的那个重复字符,也就是移动一格。
2)winLeft是满足要求的字串的左边索引位置,j是变动的右边的索引位置。
例如 :
"abcaibcbb"
第一次循环时,winLeft是0。
第二次循环时,winLeft是0。
第三次循环时,winLeft是0。
第四次循环时,winLeft是0。因为winLeft和a上一次出现的位置一样。
第五次循环时,winLeft是1。因为b上一次出现的位置是1。
第六次循环时,winLeft是1。
第七次循环时,winLeft是1。
总之,左边winLeft在不时舍弃重复的字符,右边的 i 在不断变大,于是缓慢的就找到了符合条件的字符串的最大值长度。
友情讲解链接如下:www.cnblogs.com/huansky/p/1…