【剑指offer专项】14和15. 字符串中的变位词、字符串中的所有变位词

概述

15题和14题的思路类似都是采用滑动串口的方法

方法分析

  1. 为什么不采用为运算 mask |=1<<(s1[i]-‘a’) 呢?因为这里需要检测重复字母,eg.s1=“aab”;所以这里采用 vectorcnt(26) 容器,记录26个字母中,每个字母出现的次数:++cnt[s1[i]-‘a’],这样就知道一个字母出现了多少次。

  2. 为什么使用滑动窗口?
    首先这里窗口的长度是不变的(基串p的长度),就代表high指针不需要前移。

思路

c n t [ x ] = c n t 2 [ x ] − c n t 1 [ x ] cnt[x]=cnt2[x]-cnt1[x] cnt[x]=cnt2[x]cnt1[x]来表示基串s和p的子串s2中x字母的个数是否相同,相同cnt[x]==0,当子串上x字母多了个,则+1,反之则-1;并用diff记录字母不同的个数。
用滑动窗口遍历p的所有可能子串,滑动一次,一进(x)一出(y),若进之前,cnt[x]==0,进之后,cnt[x]=1了,字母不同的个数多一个,diff+1;若进之后使得cnt[x]==0,则字母不同数少一个,diff-1。出字母同理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值