每日一练【无重复字符的最长子串】

一、题目描述

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

每日一练【无重复字符的最长子串】_第1张图片

二、题目解析

算法思想:移动窗口的思想去解决。

那为什么要用这个方法解决呢?

我们首先用暴力的思路去遍历一遍,我们遍历到deabc后,出现了第一个重复字符a,如果此时左指针直向后移动一位,然后右指针继续从左指针的下一位慢慢遍历,会重蹈覆辙。

因此我们发现这样的一个规律:那就是当遍历出现重复字符时,再重新遍历,左指针应该从重复的字符下一位开始,这样就避免很多的重复操作。

这样左右指针都是向同一方向去遍历,符合我们的移动窗口的题目的条件,所以这时我们才回去采用移动窗口去解决!


下面就是利用移动窗口的思想去解决这道题。

  1. 让做右指针都为0
  2. 进窗口,让字符进入哈希表
  3. 判断窗口是否出现重复字符
  4. 更新最大值

每日一练【无重复字符的最长子串】_第2张图片

三、原码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0,right = 0;
        int ret = 0;
        //用数组实现简易的哈希表
        int hash[128] ={0};
        if(s.size() == 1)
            return 1;
        while(right < s.size())
        {
            hash[s[right]]++;
            while(hash[s[right]] > 1)
            {
                hash[s[left++]]--;
            }
            ret = max(ret,right-left+1);
            right++;
        }
        return ret;
    }
};

你可能感兴趣的:(C语言/C++练习题,算法)