给定两个字符串A和B,找到A必须重复的最小次数,使得B是它的子字符串。如果没有这样的解决方案,则返回-1。
例如,A =" abcd"和B =" cdabcdab"。
返回3,因为重复A三次(“abcdabcdabcd”),B是它的子串;和B不是A的子串重复两次(" abcdabcd")。
注意: A和B的长度在1到10000之间。
解决方案有这样的解释:
现在,假设q是len(B)< = len(A * q)的最小数。我们只需要检查B是否是A * q或A *(q + 1)的子串。如果我们尝试k< q,那么B的长度大于A * q,因此不能成为子串。当k = q + 1时,A * k已经足够大,可以尝试B的所有位置;即,A [i:i + len(B)] == B,i = 0,1,...,len(A) - 1。
我无法围绕q + 1案例。如果q是将B作为子字符串的最小数字,那么为什么在代码中我们必须检查q + 1情况。
很久以前有人问过。 Repeated String Match
答案 0 :(得分:0)
举个例子:A =“abcd”,B =“cdabcdab”。然后是len(B) = 8
和len(A) = 4
。因此,q = 2
。但是A * 2 = abcdabcd
,所以B
不是子字符串。因此,您还需要检查A * 3 = abcdabcdabcd
。
请注意,q
不是B
成为A*q
的子字符串的最小数字,而是len(B) <= len(A*q)
保留的最小数字。