Stay Hungry, Stay Foolish

字符串的包含问题

给定字符串A和短字符串B,最快的判断出B中的所有字符是否都在A中?假设所有字符都在ASCII表中。


例如:
A是“abcDeF”,B是“aaD”则返回true,
A是“abcDeF”,B是“aaBD”则返回false,

相当于字典问题,所有字符都在字典中出现则返回true,否则返回false。每一个字符都是一个符号,按题目要求只需标识是否存在,而不需标识出现次数。对测试字符串进行在字典字符串中的遍历,当然可以解决问题但是时间成本大。如果应用字典的的话会引入额外的数据结构,而且在空间上也并不是最优。于是有如下思路:本身目的就是为了标识,就是0、1问题,那就可以引入二进制每一位来标识。ASCII本身包含了128个字符,所以需要128位来标识每一个字符,在64位系统中python最大整数有64位其中包括符号位,则可用的有63位,则我们使用3个整数就可以标识128位字符,将三个整数排列起来忽略符号位共有189位,最多可标识189个字符。现在只需要找到每个ASCII字符对应位置即可。示意图如下:

python代码如下:

import sys
class StringContain:
   listhash = []
   maxlen = 63

   def __init__(self):
      self.maxlen = len(str(bin(sys.maxsize))) - 2
      self.listhash=[0]*(128//self.maxlen+1)

   def _getindex(self,c):
      idx=ord(c)//self.maxlen
      return idx,ord(c)-idx*self.maxlen

   def test(self,string,test_string):
      for i in string:
         idx,tmpnum=self._getindex(i)
         realnum = 2**tmpnum
         self.listhash[idx] |= realnum

      for j in testString:
         idx, tmpnum = self._getindex(j)
         realnum = 2**tmpnum
         if (self.listhash[idx] & realnum) == 0:
            return False
      return True

测试代码如下:

A='abcDeF'
B='aaD'
sc=StringContain()
print(sc.test(A,B))
A='abcDeF'
B='aaBD'
print(sc.test(A,B))

输出

True
False
喜欢 (1)
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦


Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in C:\inetpub\wordpress\wp-content\themes\XHBlog\comments.php on line 17
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址