我需要快速的找出出现频率最多的字串,因此需要快速搜寻的涵式
正好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.)压缩完了,恢复的了吗?