defcompute_hash(child: str, lens: int) -> int: """ 计算子串hash """ res = 0 for i inrange(len(child)-1, -1, -1): res += ord(child[i]) * (HEX**(lens-i-1)) return res
defrk(main: str, child: str) -> bool: """ RK算法 假设要比较的字符只在大写/小写字母、数字中 时间复杂度O(n) """ n = len(main) m = len(child) first = compute_hash(child, m) # 边计算边存储 h = [0for _ inrange(n-m+1)] h[0] = compute_hash(main[0:m], m) if h[0] == first: returnTrue # 遍历一轮,动态根据h[i-1]计算h[i]的hash值 for i inrange(1, n-m+1): h[i] = (h[i-1] - (HEX**(m-1))*ord(main[i-1]))*HEX + ord(main[i+m-1]) if first == h[i]: returnTrue returnFalse