Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 반복 횟수 세기

<시간/>

비어 있지 않은 두 개의 문자열 s1과 s2(최대 100자)가 있고 두 개의 숫자 n1과 n2가 모두 0에서 106 사이의 범위에 있다고 가정합니다. 이제 S1=[s1,n1] 및 S2=[인 문자열 S1과 S2를 가정합니다. s2,n2].

S =[s,n]은 n개의 연결된 문자열 s로 구성된 문자열 S를 정의합니다. 예를 들면 ["ab", 4] ="abababab"입니다.

반면에 s1이 되도록 s2에서 일부 문자를 제거하면 문자열 s1을 문자열 s2에서 얻을 수 있다고 정의합니다. 따라서 "abc"는 정의에 따라 "abdbec"에서 얻을 수 있지만 "acbbe"에서는 얻을 수 없습니다.

S1에서 [S2,M]을 얻을 수 있도록 최대 정수 M을 찾아야 합니다.

따라서 입력이 s1="acb", n1=4, s2="ab", n2=2와 같으면 출력은 2

가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • s2의 각 문자 c에 대해

    • c가 s1에 없으면 -

      • 0 반환

  • p1 :=0, p2 :=0, 표시 :=0

  • p1

    • c :=s2[s2의 p2 모드 크기]

    • (s1[p1 mod size of s1]은 c와 같지 않고 p1

      • (p1을 1씩 증가)

    • (p2를 1씩 증가)

    • (p1을 1씩 증가)

    • s2의 p2 mod 크기가 0과 같으면 -

      • p2가 s2의 크기와 같으면 -

        • 마크 :=p1

      • 그렇지 않으면 s1의 p1 모드 크기가 s1의 표시 모드 크기와 같으면 -

        • round :=(s1 * n1 - p1의 크기) / (p1 - 표시)

        • p1 :=p1 + 라운드 * (p1 - 표시)

        • p2 :=p2 + 원형 * (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