无重复字符的最长子串_优选算法(C++)滑动窗口
网页直达:
https://leetcode.cn/problems/wtcaE1
题目分析:
1.字串VS子数组,都是连续的一段,找到没有重复的最小的一段.
解法一:暴力枚举+哈希表(判断字符是否重复出现)(O(N^2))
解法二:滑动窗口(其实是暴力枚举的优化)+哈希表
同样的我们来用图像来展现其过程:
我们简单来说明这是为什么:
其实就象一个窗口滑来滑去,在本题目中,一旦一段重复就滑动另一端,而不重新重头遍历,就会减少枚举的次数.
代码实现:
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;}
};
我们简单介绍一下哈希表:
哈希表(Hash Table),也叫散列表,是一种高效的数据结构,核心思想是通过「哈希函数」将数据的「键(Key)」映射到对应的「值(Value)」的存储位置,从而实现快速的插入、查找和删除操作。
这里我们用数组模拟实现了哈希表:我们来说明其中一个过程:
在前面hash数组里面已经进了一个a了, 执行hash[s[right]]++, s[right]就是a,变成hash[a]++,就是表示一个a,在入一个a就变成2,就重复了,此时滑动窗口,让重复的元素出去,即left++;