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

C++에서 target과 동일한 고유한 하위 시퀀스의 수를 찾는 프로그램


두 개의 소문자 문자열 s와 t가 있다고 가정하면 t와 동일한 s의 부분 시퀀스 수를 찾아야 합니다. 답이 매우 크면 10^9 + 7로 결과를 반환합니다.

따라서 입력이 s ="abbd" t ="bd"와 같으면 두 개의 가능한 하위 시퀀스 "bd"가 있으므로 출력은 2가 됩니다.

  • s[1] s[3] 연결

  • s[2] s[3]을 연결합니다.

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

  • m :=10^9 + 7

  • t의 크기가 0과 같으면 -

    • 0 반환

  • t가 s와 같으면 -

    • 1 반환

  • t의 크기> s의 크기인 경우 -

    • 0 반환

  • t + 1의 크기와 동일한 크기의 배열 테이블을 정의하고 0으로 채움

  • 테이블[0] :=1

  • initialize i :=0의 경우, i

    • onsave 배열 정의 :=table

    • j 초기화의 경우:=0, j <테이블 크기일 때 업데이트(j를 1만큼 증가), −

      • s[i]가 t[j]와 같으면 -

        • 테이블[j + 1] =(테이블[j + 1] mod m + onsave[j] mod m)

  • 테이블[j + 1] =(테이블[j + 1] mod m + onsave[j] mod m)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
int solve(string s, string t) {
   int m = 1000000007;
   if (t.size() == 0)
      return 0;
   if (t == s)
      return 1;
   if (t.size() > s.size())
      return 0;
   vector<int> table(t.size() + 1, 0);
   table[0] = 1;
   for (int i = 0; i < s.size(); i++) {
      vector<int> onsave = table;
      for (int j = 0; j < table.size(); j++) {
         if (s[i] == t[j]) {
            table[j + 1] = (table[j + 1] % m + onsave[j] % m) %m;
         }
      }
   }
   return table[t.size()] % m;
}
main(){
   string s = "abbd", t = "bd";
   cout << (solve(s, t));
}

입력

"abbd", "bd"

출력

2