固定窗口大小的滑动窗口法
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
# 字符串长度
n = len(s)
# 词表个数
word_num = len(words)
# 设置计数器
counter = collections.Counter(words)
# 每个单词长度
word_len = len(words[0])
# 固定窗口大小
window_size = word_len * word_num
# 开始滑动窗口
res = []
for i in range(n-window_size+1):
# 设置临时计数器,用于计算窗口中的单词种类与个数
counter_temp = collections.Counter()
# 对于窗口进行切词
for t in range(i, i+window_size, word_len):
word = s[t:t+word_len]
counter_temp[word] += 1
# 判断是否与目标词表的单词种类与个数相等
if counter_temp == counter:
res.append(i)
return res
双指针法
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
# 字符串长度
n = len(s)
# 词表大小
number_words = len(words)
# 单词长度
n_word = len(words[0])
# 初始化计数变量
counter = collections.Counter(words)
# 结果数组
res = []
# 双指针迭代
for i in range(n_word):
# 开始进行双指针操作
left = i
right = i
map_ = collections.Counter()
while right + n_word <= n:
# 取出该单词
word = s[right:right+n_word]
# 添加窗口
map_[word] += 1
# print(left, right, s[left:right], count)
# 左指针右移动
while map_[word] > counter[word]:
left_word = s[left:left+n_word]
map_[left_word] -= 1
left += n_word
# 如果是词表中的词并且符合个数要求,窗口大小+1
right += n_word
if (right-left) == number_words*n_word:
res.append(left)
return res
双指针优化(跳过不存在单词)
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
# 字符串长度
n = len(s)
# 词表大小
size = len(words)
# 词表计数器
counter = collections.Counter(words)
# 单词长度
word_len = len(words[0])
# 结果数组
res = []
# 遍历起始位置
for i in range(word_len):
# 定义双指针
left = i
right = i
# 定义窗口计数器
temp = collections.Counter()
# 开始迭代双指针
while right + word_len <= n:
# 右指针单词
word = s[right:right+word_len]
# 单词没在词表里,窗口瞬间变为0,双指针均跳过
if word not in words:
left = right+word_len
temp.clear()
# 单词在词表中,判断其个数是否超过词表
else:
# 窗口增加一个单词
temp[word] += 1
while temp[word] > counter[word]:
# 左指针单词
left_word = s[left:left+word_len]
# 窗口减少一个单词
temp[left_word] -= 1
left += word_len
right += word_len
# 结果添加
if right - left == word_len * size:
res.append(left)
return res
小黑生活(通过群聊和朋友圈的图片回忆,图片不连贯)
在武汉江边江景房,起床了看看外面的大楼和江景,天气是阴的,跟我内心一样孤独。
出来转转汉口江滩
一个人参观八七会议旧址,缅怀先烈
去网红店陶仙居吃烧卖和糊汤粉
大冷天骑车去古德寺参观
去“食藕武昌鱼精致湖北菜”吃武昌鱼,一个人吃一条
喝茶颜悦色,蔓越阑珊
江边走走
坐地铁前往天河机场
坐上了飞往北京大兴的飞机,拍到了晚霞好美啊
玩命冲刺赶上了大兴机场的高铁发车,速度快还比地铁便宜
麦当劳早餐
午餐干饭
午间咖啡
晚餐麻辣烫
搓澡蒸桑拿
紫光园早餐
午餐牛肉面干饭
午间咖啡
晚上在家涮点儿羊肉
收到了南京马拉松奖状
紫光园豆腐脑
午餐干饭
午间咖啡
晚餐食堂煎饼
去朝阳公园参加团跑活动,发现没人去,自己买了杯喜茶,回家喝啤酒吃薯片
早餐紫光园羊汤
午餐干饭
午间咖啡
学习flex前端框架
盲人按摩
麦当劳早餐
提提神,苏州半程环阳山马拉松送的饮料
午餐干饭
午间咖啡
晚餐食堂三明治
练琴前的烤冷面
回家发现有点儿发烧
发了一周末烧来单位的午餐,中午骑车去拔罐,结果手机没电了找不找地方着急死了,最后去便利蜂充电
回家又发烧了
在家请假点了个喜茶外卖,少送了一个蛋糕,后来打电话才补送来
好转了
张亮麻辣烫下午餐干饭
单位午餐干饭
单位晚餐干饭
练琴前烤冷面
晚间按摩
麦当劳早餐
午餐干饭
晚餐前的串串麻辣烫
回姥姥家,又给我买了几斤新鲜羊肉
晚上回来后喜茶学习,看看刑法,最后放弃了
跟尚香吃KFC
搓澡汗蒸
麦当劳早餐
午餐干饭
午间咖啡
回家煎牛排,与方便面混着吃
练完琴跑个步
食堂早餐干饭
午餐干饭
午间咖啡
回学校跟师弟吃个饭,顺便取一下屏幕,师弟请我吃麻辣烫
成功把阿黄的屏幕拿了回来,并连接成功
午餐干饭
午间咖啡
晚上跑个步,跑完喝两口
食堂早餐
午餐干饭
午间咖啡
晚霞
晚餐pizza,忘拍了
晚饭后奈雪的茶
来个盲人足疗
第二天中午再来个刮痧和拔罐
晚上去vr练车,中间出来吃个卤煮
上午去学钢琴考级曲子
一个人看年会不能停
看完电影绕着周围跑跑步
早餐食堂干饭
午餐干饭
同事去了长沙参加婚礼,给我带了茶颜悦色包
午间咖啡
报名了合唱表演,考核被刷了
晚餐肉夹馍干饭
报名打鼓,最后被调剂到了舞狮子
夜宵喝点儿酒吃个串
麦当劳早餐
我的屏幕们
午餐干饭
午间咖啡
看看日语
晚餐食堂干饭
晚间跑步
早餐干饭
午餐干饭