以下是一个 C 语言实现的滑动窗口算法示例,用于查找字符串中最长的连续子串,该子串中的所有字符都是唯一的: #include<stdio.h>#include<string.h>voidfindLongestSubstring(char*str){intleft =0, right =0;intmaxLength =0;intstart =0;intcharIndex[256] = {0};// 用于存储字符出现的位置while(str[right...
// 把初始窗口填上, 求得当前窗口最值, 注册 intm = k <= ( nums.size()) ? k :nums.size(); for(inti =0; i < m ; i ++) { window.push_back(nums[i]); cur_max =max( cur_max , window.back()); } ans.push_back(cur_max); // 窗口大小要是比数组size大,就不用滑动了 if(...
我首先会定义两个整型名字为left(代表的是左窗口指向元素的下标),right(代表的是右窗口指向元素的下标)。以及一个哈希表,(因为题目中只会出现char类型的数据,所以我们可以使用一个大小为128的整型数组来模拟实现哈希表,因为char类型的asc2码范围为-127到128,那么使用一个大小为128的整型数组肯定能够装下)这个哈希表...
由于是查找最值所以我们需要对字符串进行遍历查找,在遍历循环的过程我们需要两个指针right,left,将right,keft初始化为0。(注:此指针并非C语言的指针,该指针表示字符数组的下标指针),通过指针right我们可以遍历查找到最长对应要求的子串长度(遍历到存在重复字母种类为止),如果运气好在right的后续遍历中不存在更优的子串...
charc=t.charAt(i); need.put(c, need.getOrDefault(c,0) +1); } intleft=0, right =0; intcategory=0;// 记录窗口中符合条件的目标字符的种类 intstart=0; intwindowLength=s.length() +1; while(right < s.length()) { charrightChar=s.charAt(right); ...
昨天被网易二面投屏算法虐了一番,痛定思痛,每日一道算法题。下面来看看这道算法题: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度和字符。 输入: "abcabcbb" 输出: 3,abc,bca,cab 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1.C语言 注意: 使用哈希表来统计字符出现的次数,哈希表的大小为 128 是因为该题目中使用的字符集为 ASCII 字符集,ASCII 字符共有 128 个字符(包括控制字符和可打印字符),因此使用大小为 128 的哈希表可以准确地记录每个字符的出现次数 代码语言:javascript ...
解释:总共有 11 个合法子字符串:“c”, “b”, “a”, “ba”, “aa”, “bc”, “baa”, “aab”, “ab”, “abc” 和“aabc”。最长合法子字符串的长度为 4 。 其他子字符串都要么包含 “aaa” ,要么包含 “cb” 。 示例2: 输入:word = “leetcode”, forbidden = [“de”,“le”,“...
[a b a b b c] unique = 1,2,3 以字符种类数为2为例,解析滑动窗口运行情况 lr [curUnique = 1 <= 2, {a:1}, r++, atLeastK = 0,] l r [curUnique = 2 <= 2, {a:1,b=1}, r++, atLeastK = 0, r++] l r [curUnique = 2 <= 2, {a:2,b=1}, r++, atLeastK = ...
滑动窗口,顾名思义,就是有一个大小可变的窗口,左右两端方向一致的向前滑动(右端固定,左端滑动;左端固定,右端滑动)。可以想象成队列,一端在push元素,另一端在pop元素,如下所示:假设有数组[a b c d e f g h]一个大小为3的滑动窗口在其上滑动,则有:1、单层循环 2、双层循环 模板...