字符串查找问题

本文探讨了在字符串匹配中使用哈希算法的方法,包括传统哈希、素数法和ASCII位映射三种实现方式,详细解释了每种方法的时间复杂度和空间效率,并通过实例说明了如何判断字符串中每个字符是否都在另一个字符串中出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原问题与解答是在网上看到的,但是忘记网址了,这里自己重新大概说一遍。

假设字符串 A:  abcjsjdefsg

字符串B :  bkbgdsgs

如何判断字符串B的每个字符在A中是否都出现?

像上面的话,由于B的k字符不在A串内,所以是肯定不行的,所以就返回false

如果B是bsbgdsgs的话,那么B的所有字符都在A里面可以找到,那么就返回True了


这里有比较传统的做法,第一个做法是哈希的做法

对A中的字符串的每个字符都进行哈希等到整数值,然后B中的也这样做,这样就可以判断是否找到了,这样的时间复杂度是O(m+n)


另外一种做法是素数的方法

将A中的每个不同字符都对应一个素数,然后将A中的每个字符对应的素数相乘,这样就得到一个整数,然后再用这个整数去除B中的每个字符对应的素数,然后出现余数了,那么就可以返回False了,如果到底也没有余数,那么就返回True了,这样的复杂度是时间O(m+n)


还有一种做法,但是前提是字符都是ascii值

申请256个bit,然后对应每个A中的每个字符都是可以映射到一个bit,将其置1.例如'a'的ascii值就是96,那么在96这个位置上将其置1,相同的可以不管。到B时就可以对其每个字符进行判断了,这样的时间复杂度也是O(m+n),但是占用的空间就是O(1)了。

这种方法是有字符大小的限制的, 或者也可以申请为unicode的范围大小,对于字符串先转为unicode的值,然后再利用上面的匹配,这样应该也是可以的,而且就不用考虑字符串里面字符的限制了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值