C++ 中的重复计数


假设我们有两个非空字符串 s1 和 s2(最多 100 个字符)和两个数字 n1 和 n2,它们都在 0 到 106 的范围内。现在假设字符串 S1 和 S2,其中 S1=[s1,n1] 和 S2=[s2,n2]。

S = [s,n] 定义了一个字符串 S,它由 n 个连接的字符串 s 组成。例如,["ab", 4] ="abababab"。

另一方面,我们也可以定义,如果从字符串 s2 中删除一些字符后可以得到字符串 s1,则可以说字符串 s1 可以从字符串 s2 中得到。“abc”可以从“abdbec”得到,但不能从“acbbe”得到。

我们需要找到最大的整数 M,使得 [S2,M] 可以从 S1 得到。

例如,如果输入为 s1="acb", n1=4, s2="ab", n2=2,则输出为 2

为了解决这个问题,我们将遵循以下步骤:

  • 对于 s2 中的每个字符 c

    • 如果 c 不在 s1 中,则:

      • 返回 0

  • p1 := 0, p2 := 0, mark := 0

  • 当 p1 < s1 的大小 时,执行:

    • c := s2[p2 mod s2 的大小]

    • 当 (s1[p1 mod s1 的大小] 不等于 c 且 p1 < s1 的大小 * n1) 时,执行:

      • (将 p1 加 1)

    • (将 p2 加 1)

    • (将 p1 加 1)

    • 如果 p2 mod s2 的大小 等于 0,则:

      • 如果 p2 等于 s2 的大小,则:

        • mark := p1

      • 否则,当 p1 mod s1 的大小 等于 mark mod s1 的大小 时,则:

        • round := (s1 的大小 * n1 - p1) / (p1 - mark)

        • p1 := p1 + round * (p1 - mark)

        • p2 := p2 + round * (p2 - s2 的大小)

  • 返回 p2 / s2 的大小 / n2

示例

让我们看看下面的实现以更好地理解:

在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int getMaxRepetitions(string s1, int n1, string s2, int n2) {
      for (auto c : s2) {
         if (s1.find(c) == string::npos)
            return 0;
      }
      int p1 = 0, p2 = 0, mark = 0;
      while (p1 < s1.length() * n1) {
         char c = s2[p2 % s2.length()];
         while (s1[p1 % s1.length()] != c && p1 <s1.length() * n1)
         p1++;
         p2++;
         p1++;
         if (p2 % s2.length() == 0) {
            if (p2 == s2.length()) {
               mark = p1;
            }
            else if (p1 % s1.length() == mark % s1.length()) {
               int round = (s1.length() * n1 - p1) / (p1 - mark);
               p1 += round * (p1 - mark);
               p2 += round * (p2 - s2.length());
            }
         }
      }
      return p2 / s2.length() / n2;
   }
};
main() {
   Solution ob;
   cout << (ob.getMaxRepetitions("acb",4,"ab",2));
}

输入

"acb",4,"ab",2

输出

2

更新于:2020-07-21

249 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告