无顺序约束的字符串匹配问题

字符串A较长,字符串B较短,如何以最短时间判断出B里的所有字母在A中都有: BA
举例:
A=abcdeabcdft,B=dcea,返回ture
若:B=dfgz,返回false

本题没有字符串顺序约束,不需要保证B中字母在A出现的相对顺序不变。下文帮助大家如何一步步优化匹配算法。(有顺序约束的字符串匹配问题,请大家参考KMP算法)
设len(A)=m,len(B)=n

  • 最简单的方法-轮询O(m n)

    轮询字符串B中的每个字母,看其是否在A中出现过。即判断BiA。这种方法是最笨的方法,时间复杂度为O(m n),不可取。

  • 先排序,再同时轮询两个字符串O(mlogm)

    可以先对两个字符串按字典排序,然后在A中找到和B相同的起始位置,同时进行轮询。此时时间复杂度分类两段:
    排序:O(n logn +m logm )(一般排序)
    轮询:O(m+n)
    整体是 mlogm 的时间复杂度,如果排序使用O(m)的方法就另说。
    这里写图片描述

  • 使用hashtable: O( α m+ β n)

    hashtable的优点是查询时间为O(1),故我们可以轮询字符串A,将其放在hashtable里O(m),然后轮询字符串B,在hashtable里查询每个字母 Bi ,看能否找到O(n)。这样时间复杂度为O(m+n),这是典型以空间换时间的做法。不过举一个不太恰当的例子,若在hashtable里字母a,b,c有相同的索引值,查询时间就不是O(1)了,得加上key值比较的时间。说到这,大家是不是得去看看hashtable的工作原理啦。
    这里写图片描述

  • 利用素数-O(m+n)

    对于26个英文字母,给予每个字母分配一个素数,从2开始,往后类推。a:2, b:3, c:5, d:7
    这样,轮询字符串A,将每个字母代表的素数相乘,这样会得到一个较大的数Big。然后轮询字符串B,若其字母代表的素数能被Big整除,就表示 BiA ,若有余数返回false。即使字符串A中有重复字母,仍然可以在O(m+n)时间复杂度内求得结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值