本文共 977 字,大约阅读时间需要 3 分钟。
好复杂,没有理解真谛,看巨神的思路吧。
简单写一点分析,目的就是找到循环节,用dic来记录上一次同样的字母在各自s1和s2里的位置,当又一次重复时,这里就是循环节,然后查找完全复制n1次后的到的大s1中还有多少个这样的循环节,证明起码可以让s2复制多少次了。随后继续从目前的次数所到达的大s1的位置往后找,看可以找,看是否还能继续延展,使得s2要复制更多出来。
class Solution: def getMaxRepetitions(self, s1: str, n1: int, s2: str, n2: int) -> int: if not set(s1) >= set(s2):return 0 l1 = len(s1) l2 = len(s2) dic = collections.defaultdict(dict) x1 = x2 = 0 while x1 < l1*n1: while s1[x1%l1] != s2[x2%l2]: x1 += 1 if x1 >= l1*n1: break y1,y2 = x1%l1, x2%l2 if y2 not in dic[y1]: dic[y1][y2] = x1,x2 else: lastx1, lastx2 = dic[y1][y2] around = (l1*n1 - lastx1)//(x1 - lastx1) x1 = around* (x1 - lastx1) + lastx1 x2 = around* (x2 - lastx2) + lastx2 if x1 < l1*n1: x1 += 1 x2 += 1 return int(x2//(l2*n2))
转载地址:http://zsjii.baihongyu.com/