Leet code 每日一题

无重复字符的最长子串

题目链接

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

  • 提示*
    *0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

解法(滑动窗⼝):
算法思路:
研究的对象依旧是⼀段连续的区间,因此继续使⽤「滑动窗⼝」思想来优化。
让滑动窗⼝满⾜:窗⼝内所有元素都是不重复的。
做法:右端元素 ch 进⼊窗⼝的时候,哈希表统计这个字符的频次:
▪ 如果这个字符出现的频次超过 1 ,说明窗⼝内有重复元素,那么就从左侧开始划出窗⼝,
直到 ch 这个元素的频次变为 1 ,然后再更新结果。
▪ 如果没有超过 1 ,说明当前窗⼝没有重复元素,可以直接更新结果

Leet code 每日一题_第1张图片

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
      int hash[128] ={0};//使用数组来模拟哈希表

      int left = 0,right = 0,n = s.size();
      int ret  = 0;

      while(right < n)
      {
          hash[s[right]]++; //进窗口
          while(hash[s[right]] > 1) //判断
            hash[s[left++]]--; //出窗口
            ret = max(ret,right-left+1);//更新结果
            right++;
      }

      return ret;

    }
};

你可能感兴趣的:(#,每日一道,Leed,code,leetcode,算法,c++)