基础数据结构之哈希题型

Hash表

AcWing 137. 雪花雪花雪花

一个雪花有多种表现形式,我们让它的某种特定形式与整数之间建立哈希;之后对每一个雪花重复此操作,得到一个哈希表。判断两个雪花是否相同时,看它的哈希值是否相同就可以了。

字符串Hash

AcWing 138. 兔子与兔子(模板题)

套用这个模板,我们可以求得字符串中,任意一个子串的哈希。

步骤是先求字符串的前缀(后缀)hash(特别要注意求前缀的方法,一个规模小的前缀是如何推到规模大的前缀的: h[i] = h[i - 1] * base + s[i] - ‘a’ - 1)。有了前缀hash值之后,可以求得任意子串s[L – R]的hash值:h[L – R] = h[R] - h[L - 1] * p[R - L + 1] (p数组存的是base的“下标”次方)。

再遇到类似比较两个字符串是否相等,或者两个字符串的任意子串是否相等的问题,就可以转化为比较两个字符串哈希值是否相等的问题。前者暴力比较是O(len),而后者只需要O(1)。我做过的另两个题中,都与二分配合使用;使用此方法时,可以考虑一下二分。

AcWing 139. 回文子串的最大长度

回文串问题,我们可以转换为枚举中点,然后看中点左边和右边的公共子串最大长度是多少的问题。枚举中点是O(N),求公共子串的时候可以枚举长度来找最大长度,查找最大长度可以用二分查找,时间复杂度是O(log N)。

AcWing 140. 后缀数组

这个题的思路不难,还是用哈希,但是要注意不能用substr求子串,会超时;用map还会空间溢出。

写代码使要注意如何写快速排序的cmp函数。因为不能求子串,所以我们可以用二分查找,找出两个字符串的公共前缀(题目也是让你求公共前缀),然后再比较第一个不同的元素就可以了。

矩阵

字符串哈希的二维应用。
类似于字符串前缀的递推方法,如果我们知道了某一个a行b列的矩形的面积,在它下一行的a行b列的矩形面积是可以推导出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值