使用散列。对于多重集中的每个字符,分配一个唯一的素数。通过乘以与数字相关联的质数来计算任意字符串的散列,数量与该数字的频率相同。
例如:CATTA。令C = 2,A = 3,T = 5。哈希= 2 * 3 * 5 * 5 * 3 = 450
散列multiset(将其视为字符串)。现在检查输入字符串,并计算长度为k的每个子字符串的哈希(其中k是多重字符中的字符数)。检查此散列是否与多重集合散列匹配。如果是的话,那么这是一个这样的事件。
该散列可以在线性时间很容易地计算如下:
让多重集= {A,A,B,C},A = 2,B = 3,C = 5。
多重集的散列= 2 * 2 * 3 * 5 = 60
让文本= CABBAACCA
(ⅰ)CABB = 5 * 2 * 3 * 3 = 90
(ⅱ)现在,下一个字母是A,丢弃的字母是第一个字母C,所以新散列=(90/5)* 2 = 36
(iii)现在,A被丢弃,A也被添加,所以新散列=(36/2)* 2 = 36
(iv )现在B被丢弃,并且C被添加,所以hash =(36/3)* 5 = 60 =多重集合散列。因此,我们发现了一个这样的需求发生 - BAAC
此过程显然需要O(n)时间。
我不能按照你的逻辑,说实话;你能解释你的改变的目的吗? (即在你的版本中histrunsum是什么意思,以及为什么需要改变) – zeuxcg