滑动窗口简介:
就是保持一个固定长度的窗口,每次滑动一个位置;
例题1:
给定一个字符串 s ,请你找出其中不含有重复字符的最长连续子串的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0
解题:
- 题目含义
这道题的意思就是给定一个字符串,然后要求你在这个字符串找到一个最长的连续不重复元素子串。 - 题目解法:
定义一个n,l,max,i,j;- n:表示字符串的长度
- l:表示滑动窗口起点
- max表示最大的连续不重复元素长度
- i表示遍历数组指针
- j表示遍历滑动窗口指针
- 采用二重循环,每扫描一个元素(第一重),就判断是否在已有的滑动窗口内(第二重),如果在,就判断当前的滑动窗口长度是否大于max,如果大于max,就将滑动窗口的长度赋值给max,并将l赋值为第一个重复元素的下一个位置,也就是j+1,并跳出二重循环。
- 注意:最后返回的应该是max>(i-l)?max:(i-l);(字符串本身就是最长连续不重复)
代码:
class Solution { public: int lengthOfLongestSubstring(string s) { int n=s.size(); int l=0,max=0,i=0; for(;i(i-l)?max:(i-l); l=j+1; break; } } } return max>(i-l)?max:(i-l); } };
1=============
2=============
3=============
例题2:
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入:s1= “ab” s2 = “eidboaoo”
输出:false
提示:
1 <= s1.length, s2.length <= 104
s1 和 s2 仅包含小写字母
- 题目含义
给你两个字符串s1,s2,在s2中判断是否有一个子串的排列与s1相等,如果有返回true,否则返回fasle。 - 题目解法
- 此题目说的是子串排列是否和s1相等,也就是说不用考虑顺序,只需考虑子串中的每个字符数量是和s1中的相等即可。那么就可以固定一个存储s1大小的容器来滑动s2,如果当前的滑动框内字符和s1中的不相等,那么就向右滑动一个位置,新的字符加一,而滑动框左边那个位置的字符减一。
- 可以定义两个vector容器(26)v1,v2,先用v1去遍历s1,v2去遍历s2(遍历s1的长度即可)把对比字符数量扫入,这里可以用字符-'a’把它转成整型,即对应下标为当前字符-'a’这个位置+1。
代码:
class Solution { public: bool checkInclusion(string s1, string s2) { vectorv1(26),v2(26); int n=s1.size(),m=s2.size(); if(n>m) return false; for(int i=0;i 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)