LeetCode.3. 无重复字符的最长子串

41 阅读1分钟

题目

image.png

思路


  • 核心条件:子串(意味着元素必须连续,所以应该用包含连续元素的窗口来处理)
  • 方法
    • 滑动窗口,因为期望获得更大的子串,窗口右端点尽可能往右延伸,为了不出现重复元素,左端点在出现重复元素的时候,负责向右缩进,缩紧整个窗口
    • 怎么判断元素重复:只要能计数就行,map、cnt[]计数数组

代码


int lengthOfLongestSubstring(string s) 
{
    int n = s.size();
    int ans = 0;
    map<char,int> mp;//记录字符的出现次数
    int i = 0;
    int j = i;
    while(j < n)// j: 右端点尽力向右滑动,期望获得更大的窗口
    {
        char c = s[j];
        mp[c] += 1;
        while(i<n && mp[c] > 1)// i: 左端点收缩,维护元素不重复的合法状态
        {
            mp[s[i]]--;
            i++;
        }
        ans = max(ans,j-i+1);
        j++;//右端点向右扩展
    }
    return ans;
}

总结

  • 核心条件是"子串",常用 滑动窗口 来处理(两个指针维护窗口宽度)
  • 滑动窗口的本质:右端点尽力去扩宽窗口,左端点收缩,以维护合法性。本题,左端点执行的条件,即 不能出现重复元素,因此要对窗口内部的元素计数
  • 元素计数/重复元素判断,用 计数数组 cnt[]、map