Leetcode 686重复的字符串匹配难以理解说明

时间:2019-06-29 16:49:51

标签: java string stringbuilder mod

我很难理解为什么Leetcode的重复字符串匹配的解决方案最多只能对A进行q + 1次重复(如果A.length()

我阅读了其他StackOverflow解决方案以及Leetcode讨论页面,但是我仍然无法完全理解该解决方案。

算法解释为:

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;
  }
}

我知道当A.length()

我的直觉是,在A重复了几次之后,就会建立一个模式,如果B没有落入该模式/字符序列,那么无论您重复A多少次,B都不会重复的A的子字符串。

但是,我只是不知道为什么要特别指定匹配B的长度的副本数,或者是在A.length()= B.length()之后再添加1个副本。

如果有人可以为我消除这种困惑,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您几乎了解其中的大部分内容, 因此,让我们来看另一个基本示例。

ampleex
itsalreadyhereexample
exam

让我们说B是example,而A是上述之一。


对于第一种情况,A.length()== B.length()
我们检查它是否为子字符串,否定答案。
所以我们再次添加它并得到'ampleexampleex'
现在我们得到的结果是A包含B。


对于第二种情况,A.length()> B.length()
我们检查它是否为子字符串,并得到A包含B的结果。

(如果不是在这里,我们仍然需要检查伤口是否反复出现,
相当于第一种情况)


对于第三种情况,A.length() 所以我们重复一遍直到覆盖B的长度 并得到examexam

我们看到它不在其中,所以我们再次添加它,
并且它仍然不在其中(examexamexam)。


之所以需要这样做,是因为这可能是一个更特殊的情况。
B像xamexame这样的东西-基本上是重复 之一。

(这种情况下可能的变化是重复xameamexmexa。)

在这种情况下,它必须以比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不会改变任何内容,因为我们已经涵盖了所有可能性(从现在开始将不会出现新的模式)。

如果它不在那,那将是一个声望。其他场景-哪里 它可能是子字符串-第一种情况和第二种情况均已涵盖。


我希望通过本示例可以帮助您清除混乱。 如果不是,只是问您不明白什么要点。