使用散列。對於多重集中的每個字符,分配一個唯一的素數。通過乘以與數字相關聯的質數來計算任意字符串的散列,數量與該數字的頻率相同。
例如: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