一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化

通过遍历和哈希映射两种方法解决《编程之美》中的问题:给定一个字符串和字符串集合,找出包含集合所有字符的最短子串长度。哈希映射方法的时间复杂度为O(n),通过维护字符最新位置并计算距离找到最短子串。
摘要由CSDN通过智能技术生成

题目:

给定一个字符串及一个字符串集合A,求该字符串中包含A中所有字符的最短子串长度。

 

解决方案一:

最直接的方法就是,直接开始遍历:查找任意两个子串之间是否包含str2,如果包含,记录下长度,求得最小值即可。

str1 = "daebfacba";

str2 = "abc";

minLen = len(str1);

for i = 0:len(str1)

    for j = i+1:len(str1)

        if (isContainAllElements(str1,str2,i,j)) //如果i到j的子串包含所有字符,则记录长度

            if j-i < minLen

                minLen = j-i;

考虑isContainAllElements(),复杂度为O(n3)。

 

解决方案二:

为str2中的每一个字符设置一个变量,用来存储最新的在str1中出现的位置。用H(x)来表示该数值。

以“daebfacba”为例,

1. 扫描到第一个a时,H(a)=1; H(b),H(c)无值;

2. 扫描到第一个b时,H(a)=1; H(b)= 3,H(c)无值;

3.扫描到第二个a时,由于C还无值,因此,直接覆盖a的值:H(a)=5; H(b)=3,H(c)无值;

4. 扫描到第一个c时,H(a)=5; H(b)&#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值