面试经典150题链接
面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台
209 . 长度最小的子数组
思路 :
滑动窗口的思想,取i=j=0,向后遍历j,记录前缀和[l,r]为s,如果s>=target,那么左端点向右移动,直到s 假设在一个无重复元素的字符串后面加上一个字符,如果出现重复元素,那么一定重复的是新加上的那个字符,那么设置一个hash表来统计次数,然后反复将窗口最前面的元素移出窗口,直到将前面与新加元素相同的元素移出时停止;然后循环更新答案即可; 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台代码
python
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n = len(nums)
ans = n+1
l=0
s=0
for r,x in enumerate(nums):
s+=x
while s>=target:
ans = min(ans,r-l+1)
s-=nums[l]
l+=1
return ans if ans <= n else 0
c++
class Solution {
public:
int minSubArrayLen(int target, vector
3 . 无重复字符的最长子串
思路 :
lc题解地址 :
代码 :
Python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
l = 0
cnt = Counter()
ans = 0
for r , c in enumerate(s):
cnt[c]+=1
while cnt[c]>=2:
cnt[s[l]]-=1
l+=1
ans = max(ans,r-l+1)
return ans
C++
class Solution { public: int lengthOfLongestSubstring(string s) { unordered_maphash; int ans=0; int n = s.size(); int l=0; for(int r=0;r 1) --hash[s[l++]]; ans = max(ans,r-l+1); } return ans; } };
java
class Solution { public int lengthOfLongestSubstring(String s) { int ans = 0 ; char[] st = s.toCharArray(); boolean[] has = new boolean[128] ; int n = s.length(); int i = 0 ; for(int j=0;j30 . 串联所有单词的子串
思路 :
滑动窗口,细节看代码
代码 :
class Solution { public: vectorfindSubstring(string &s, vector &words) { // 一个窗口包含s中的前a个单词; // 先删去前 i (i=0∼b−1)个字母后, // 将剩下的字母进行划分,如果末尾有不到 b 个字母也删去。 vector ans ; int a = words.size() , b = words[0].size() , n = s.size() ; for(int i=0;i mp; for(int j=0;j 76 . 最小覆盖子串
滑动窗口 :
定义两个长度为 606060(足够存下所有字母种类)的数组 c1 和 c2,用于存储字符频率。其中 c1 用于记录字符串 t 中字符的频率,c2 用于记录当前滑动窗口内字符的频率。
设定好字母与频率数组下标的映射关系:小写字母 a-z 对应下标 0-25,大写字母 A-Z 对应下标 26-51。
使用变量 tot 来记录还需要匹配的字符种类数,当 tot = 0 代表当前滑动窗口对应的子串能够实现对 t 的覆盖,即任意字符满足 c2[i]≥c1[i]c2[i] \geq c1[i]c2[i]≥c1[i]。
使用双指针 j 和 i 表示滑动窗口的左右边界。从前往后遍历字符串 s,在每个位置上更新字符频率数组 c2。若 c2 中字符的频率达到了 c1 中的字符频率,则将 tot 减 1,表示一个字符已经匹配完成。
每当右边界往后移动一步之后,滑动窗口会增加一个字符。此时我们检查左边界能否右移,同时不会使得 tot 变大。即每次右边界右移后,我们检查左边界 c2[j]>c1[j]c2[j] > c1[j]c2[j]>c1[j] 是否满足:
若满足:说明当前左边界指向字符并非必须,当前子串 s[j...i]s[j...i]s[j...i] 必然不是最短子串。我们让左边界 j 进行右移,并重复进行左边界 c2[j]>c1[j]c2[j] > c1[j]c2[j]>c1[j] 的检查,直到窗口不能再收缩
若不满足:说明当前窗口没有任何一个后缀字符串能够实现对 t 的覆盖,我们并不能对窗口实现收缩
每次对窗口移动完成后,我们检查当前 tot 是否为 000(对字符串 t 的覆盖是否完成),若为 000 则尝试用当前窗口对应的字符串 s[j...i]s[j...i]s[j...i] 更新 ans。
class Solution { public: int get(char x) { return x >= 'A' && x <= 'Z' ? x - 'A' + 26 : x - 'a'; } string minWindow(string s, string t) { int n = s.size() , cnt = 0 ;// cnt : 还需要匹配的字符种类数 // 规定 a-z : 0-25 , A-Z : 26-51 // c1 用于记录字符串 t 中字符的频率,c2 用于记录当前滑动窗口内字符的频率 vectorc1(60),c2(60); for(char c : t) if(++c1[get(c)]==1) cnt ++ ; string ans = "" ; for(int i=0,j=0;i c1[idx2] && --c2[idx2]>=0){// 能够滑出窗口 //; j++; }else{ break;//不能够滑出窗口 } } if(cnt==0 && (ans.empty() || ans.size()>i-j+1)) ans = s.substr(j,i-j+1); } return ans ; } }; 相似题目 :
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
猜你喜欢
- 16天前(零碳中国·绿色投资蓝皮书)中国"零碳"差旅之路暨"绿色低碳酒店"标准研究项目成果发布会召开
- 16天前(郭富城热舞劲歌演唱会)郭富城年度压轴《新濠尊属系列郭富城梦幻舞林演唱会2023》
- 16天前(东北地区全域旅游)东北三省一区宣传贯彻研学旅游行业标准
- 16天前(曼谷丽思卡尔顿公寓价格)在曼谷丽思卡尔顿酒店CALEŌ 邂逅鸡尾酒的浪漫艺术
- 16天前(中国最好的避暑山庄)2025中国十大避暑山庄评选揭晓,澳涞山庄夺魁
- 16天前(武隆旅游门票)炸了!519中国旅游日武隆甩出王炸福利,59.9元通玩6大景点?!
- 16天前(星级饭店的发展困境)星级饭店转型之路:从市场逻辑到行业实践的深度探索
- 16天前(2025年安徽省“百场黄梅唱响百家景区”示范展示启动)2025年安徽省“百场黄梅唱响百家景区”示范展示启动
- 16天前(内蒙古交通旅游图)内蒙古着力提升交通与旅游服务水平
- 16天前(北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章