汉明距离问题

Published: by Creative Commons Licence

  • Tags:

汉明距离问题

给定两个等长的字符串,它们的汉明距离是指两个字符串对应位置不同字符的数目。

题目1:给定n个01字符串,每个字符串长度为k,要求找出汉明距离最大和最小的两对字符串。其中1n,k3×103

我们可以发现如果用bitset来表示两个字符串,那么a and b实际上就表示各个位置是否相同,而a xor b则表示各个位置是否不同。于是乎我们可以O(n2k64)解决这个问题,常数很小。

提供一道题目

题目2:给定n个字符串,每个字符串长度为k,字符集大小为104。要求找出汉明距离最大的两对字符串。其中1n1061k6

这里我们可以用随机化的做法。每次随机将字符集中的字符等概率替换为01。可以发现在新的n个01字符串中找到的最大汉明距离,一定不超过我们的答案。并且实际上至少有2k的概率等于我们的答案。

因此从平均的角度来说,我们只需要随机大约2k次,之后解决一个01字符串找最大汉明距离的问题,后者可以O(n)解决。总的时间复杂度为O(2kn)

题目3:给定字符串ST,询问S有多少子串(与T等长)与T的汉明距离小于k。其中1|S|,|T|1060k4

提供一道问题

对于一个给定的子串,我们可以通过二分+哈希很容易找到前k个不匹配的坐标。时间复杂度为O(|T|+k|S|log2|T|)

题目4:给定两个字符串ab,要求将a循环拼接n次得到ab循环拼接m次得到b。保证|a|=|b|,计算ab的汉明距离。其中1|a|,|b|106,且1n,m1012。其字符串中的元素e范围满足1e106

提供一道题目

|a|>lcm(|a|,|b|)的时候,我们可以先计算ab的长度为lcm(|a|,|b|)的前缀的汉明距离后,乘上|a|/lcm(|a|,|b|)即可得到最终结果。接下来认为|a|=lcm(|a|,|b|)

考虑ai是否可能会与bj处于同一位置,这等价于存在一个k,满足

{k=i(moda)k=j(modb)

根据扩展中国余数定理知道k存在等价于gcd(|a|,|b|)ij。且k在模lcm(|a|,|b|)意义下唯一。

因此我们可以枚举0i<g。之后判断{ai+kg}{bi+kg}中有多少对元素不同,将所有结果加和就是我们的最终答案。这个过程O(|a|+|b|g)完成。

总的时间复杂度为O(n+m+log2n+log2m)