我很难理解为什么Leetcode的重复字符串匹配的解决方案最多只能对A进行q + 1次重复(如果A.length() 我阅读了其他StackOverflow解决方案以及Leetcode讨论页面,但是我仍然无法完全理解该解决方案。 算法解释为: 实现如下: 我知道当A.length() 我的直觉是,在A重复了几次之后,就会建立一个模式,如果B没有落入该模式/字符序列,那么无论您重复A多少次,B都不会重复的A的子字符串。 但是,我只是不知道为什么要特别指定匹配B的长度的副本数,或者是在A.length()= B.length()之后再添加1个副本。 如果有人可以为我消除这种困惑,将不胜感激。谢谢。Imagine we wrote S = A+A+A+.... If B is to be a substring of S, we
only need to check whether some S[0:], S[1:], ..., S[len(A) - 1:]
starts with B, as S is long enough to contain B, and S has period
at most len(A).
Now, suppose q is the least number for which len(B) <= len(A * q).
We only need to check whether B is a substring of A * q or A *
(q+1). If we try k < q, then B has larger length than A * q and
therefore can't be a substring. When k = q+1, A * k is already big
enough to try all positions for B; namely, A[i:i+len(B)] == B for i
= 0, 1, ..., len(A) - 1.
class Solution {
public int repeatedStringMatch(String A, String B) {
int q = 1;
StringBuilder S = new StringBuilder(A);
for (; S.length() < B.length(); q++) S.append(A);
if (S.indexOf(B) >= 0) return q;
if (S.append(A).indexOf(B) >= 0) return q+1;
return -1;
}
}
答案 0 :(得分:0)
我认为您几乎了解其中的大部分内容, 因此,让我们来看另一个基本示例。
ampleex
itsalreadyhereexample
exam
让我们说B是example
,而A是上述之一。
对于第一种情况,A.length()== B.length()
我们检查它是否为子字符串,否定答案。
所以我们再次添加它并得到'ampleexampleex'
现在我们得到的结果是A包含B。
对于第二种情况,A.length()> B.length()
我们检查它是否为子字符串,并得到A包含B的结果。
(如果不是在这里,我们仍然需要检查伤口是否反复出现,
相当于第一种情况)
对于第三种情况,A.length()examexam
。
我们看到它不在其中,所以我们再次添加它,
并且它仍然不在其中(examexamexam
)。
之所以需要这样做,是因为这可能是一个更特殊的情况。
B像xamexame
这样的东西-基本上是重复
之一。
(这种情况下可能的变化是重复xame
,amex
,mexa
。)
在这种情况下,它必须以比B长的重复形式出现, q + 1来自哪里。
让我们详细了解一下重复操作:
B的长度最多为(A.length()* q)+ x,其中x为[0,A.length]。
A = exam
B = xame[xame]
B仍然是A的副本,但是最后一个副本中的每个字符都是可选的。
examexam
xame
xamex
xamexa
xamexam
examexamexam
xamexame
向S添加另一个exam
不会改变任何内容,因为我们已经涵盖了所有可能性(从现在开始将不会出现新的模式)。
如果它不在那,那将是一个声望。其他场景-哪里 它可能是子字符串-第一种情况和第二种情况均已涵盖。
我希望通过本示例可以帮助您清除混乱。 如果不是,只是问您不明白什么要点。