【优选算法】滑动窗口 ⽆重复字符的最⻓⼦串

【优选算法】滑动窗口 ⽆重复字符的最⻓⼦串_第1张图片
解法⼀(暴⼒求解)(不会超时,可以通过):
算法思路:
枚举「从每⼀个位置」开始往后,⽆重复字符的⼦串可以到达什么位置。找出其中⻓度最⼤的即可。
在往后寻找⽆重复⼦串能到达的位置时,可以利⽤「哈希表」统计出字符出现的频次,来判断什么时候⼦串出现了重复元素。

class Solution {
public:
	int lengthOfLongestSubstring(string s) {
		int ret = 0; // 记录结果
		int n = s.length();
		// 1. 枚举从不同位置开始的最⻓重复⼦串
		// 枚举起始位置
		for (int i = 0; i < n; i++)
		{
			// 创建⼀个哈希表,统计频次
			int hash[128] = { 0 };
			// 寻找结束为⽌
			for (int j = i; j < n; j++)
			{
				hash[s[j]]++; // 统计字符出现的频次
				if (hash[s[j]] > 1) // 如果出现重复的
					break;
				// 如果没有重复,就更新 ret
				ret = max(ret, j - i + 1);
			}
		}
		// 2. 返回结果
		return ret;
	}
};

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

你可能感兴趣的:(算法学习,算法,数据结构)