算法--滑动窗口法(请找到满足 xx 的最 x 的区间(子串、子数组) )

198 阅读1分钟
// :给一个字符串,获得没有重复字符的最长子字符的长度
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…