活跃农民
- 积分
- 430
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-8-4
- 最后登录
- 1970-1-1
|
10.6 复习
****这里是滑动窗口的问题,滑动窗口就是确定好左端点右端点的范围,然后用一个HashMap来记录当前范围内部的一些信息,然后右指针往前走,走到一定程度满足一些条件后,左指针再继续走
3. Longest Substring Without Repeating Characters. 复习;找到最长的不包括重复字符的substring,这是典型的双指针圈定滑动窗口使用HashMap的题目;窗口的右端点不断往前走,每遇到一个字符,都包含到窗口中,也就是记录到Map中;Map的key是字符,value是出现的累计次数;如果右端点检查到一个字符,包括这个在内它在窗口中已经出现了多于1次,那么窗口的左端点就要往前走,一个字符一个字符的吐出来,直到把当前检查的右端点对应的字符的次数减为1;而如果不多于1次的话,右端点每向前走一步,都需要比较更新当前最大的substring长度
395. Longest Substring with At Least K Repeating Characters. 复习;这个题目要找到一个最长的substring,使得里面的所有字符在这个substring的出现次数,都不小于k次;那么首先遍历这个String,对于每个字符做统计,结果放到Map里面;那么对Map的每一个key-value pair做遍历,如果发现所有的key对应的次数都大于k,那么给定String本身就是一个满足条件的,自然最长;否则,使用滑动窗口;首先右端点向前走,如果现在右端点对应的字符在Map中的value也就是出现次数小于k的话,说明这个字符肯定不能被包含在目标substring之内,那么对从左端点开始到当前右端点之间的这段substring做recursion处理,注意这里使用recursion是求这段substring里面最长的所有字符出现次数都大于k的substring长度,然后和res进行比较更新;之后左端点要跳到右端点的后面一位,因为右端点这时指向的字符肯定没用了;然后右端点每次都前进
159. Longest Substring with At Most Two Distinct Characters. 复习;这个题目我在自己做的时候使用了一个非常不适合推广的方法;那么正确的通用方法就是,用map去记录滑动窗口的重要信息;然后滑动窗口,右端点每次往前进,每遇到一个新的字符都要往map里面检查更新,如果遇到一个新的字符,那么记录当前distinct字符的counter要++,否则的话单纯更新map;如果现在的counter大于2的话,说明当前的滑动窗口当中已经包含了多于两个独特字符;这时左端点就要往前走,每往前走一个都实际上是吐出来一个字符,那么被吐出来的字符对应在map中出现的次数对应减1;那么如果减1完以后发现这个字符对应的次数已经是0了,那么counter就要--;减到小于等于2的时候,右端点才能继续走
340. Longest Substring with At Most K Distinct Characters. 复习;这个题目跟上一个two的题目完全一样,就是把2换成给定的k就好了;这里要额外注意,在代码中什么时候移动右指针什么时候移动左指针,什么时候进行比较更新
76. Minimum Window Substring. 复习;这里是要找出,最小的substring,使得这个substring能够包括所有的给定targetString的字符;那么做法就是maintain一个hashmap,这个hashmap中的key是给定字符,value是给定字符的出现次数;那么又一个滑动窗口,右端点往前走,如果右端点指向的字符是给定字符的话,也就是在hashmap中检查是否contains,那么就要hashmap的对应key的value进行减1,并且计数器--;那么当计数器为0的时候(这个计数器实际上就是记录给定targetString的size的,还有多少个char没有被包含在窗口当中),就是可以要移动左端点的时候,去缩减窗口的长度,同时比较更新当前长度即可
|
|