字符串问题---最小包含子串的长度

【题目】

  给定字符串str1和str2,求str1的子串中含有str2所有字符的最小子串长度。

【举例】

  str1 = “aabcde”, str2 = “ca”。返回3.
  str1 = “12345”, str2 = “344”。返回0.

【基本思路】

  使用一个哈希表记录str2中每一个字符出现的次数。需要四个变量:left,right表示str1子串str1[left…right]的两边界下标,match表示在子串str1[left…right]中目前一共欠str2多少个字符。minlength记录整个遍历过程中出现的最小的子串长度。初始时,left = right = 0,match = len(str2),minlength = 系统的最大值。
  
  遍历str1,先向右扩张right,当遇到str2中的字符是,将map中相应的值 -1,同时match也 -1;如果遇到的不是str2中的字符,将(str1[right],-1)记录到map中。当match == 0时,说明str1[left…right]已经包含了str2中的所有字符,但是此时的子串长度还不是该子串的最小长度,例如,例1中开始出现两个a,但是第二个a到c的距离才是最小距离。所以接下来还有一个向右扩张left的过程。
  
  向右扩张left,如果map[str1[left]] < 0,说明此时如果把这个字符捡起来,str1[left…right]中也不会欠str2字符,所以捡起该字符。如果map[str1[left]]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值