我需要快速的找出出現頻率最多的字串,因此需要快速搜尋的涵式
正好Leecode 1044. Longest Duplicate Substring有類似的題目,我們就參考別人的寫法稍微改動一下吧
def longestDupSubstring(s):
def rabin_karp(s, length, power, n, M):
cur = 0
hash_map = {}
# 這一步將字串變成比較短小的雜湊值,方便比對
for i in range(length):
cur = (cur * 256 + s[i]) % M
hash_map[cur] = {s[i: i + length]:1}
# 這一步將字串變成比較短小的雜湊值,方便比對
# n 儲存實際字串
for i in range(length, n):
cur = ((cur - power[length - 1] * s[i - length]) % M + M) % M
cur = (cur * 256 + s[i]) % M
n = s[i - length + 1 : i - length + 1 + length]
if cur not in hash_map:
hash_map[cur] = {n:1}
else:
if n in hash_map[cur]: # 如果比對雜湊值相同,再用n來確認字串是否完全一致
hash_map[cur][n] += 1
else:
hash_map[cur].update({n:1}) # 在很低的幾率中,相同雜湊值出現不同字串,但是還是有這種可能
lst = []
for x, y in hash_map.items():
# j = n, 也就是字串
for j, k in y.items():
# 我們只收錄重複次數>2的字串
if k > 2:
lst.append([j,(length-1)*k]) # 這邊是簡單假設用 1byte 替換 length byte 的字串,因此可以省下 length-1 byte 的空間,再乘上 k 次重複
return sorted(lst, key=lambda item: item[1], reverse=True)[:2717]
lst = []
n = len(s)
M = 10**7 + 7
power = [1]
for i in range(10):
power.append(power[-1] * 256 % M)
# 正向找重複三次以上
for length in range(3, 10):
lst += rabin_karp(s, length, power, n, M)
lst = sorted(lst, key=lambda item: item[1], reverse=True)[:2717]
return [i[0] for i in lst]
自己嘗試壓縮文檔,到底有多少效果?——(5.)壓縮完了,恢復的了嗎?