문자열 S가 있다고 가정하고 S의 고유한 하위 시퀀스 수를 계산해야 합니다. 결과가 클 수 있으므로 모듈로 10^9 + 7을 반환합니다.
따라서 입력이 "bab"과 같으면 출력은 "a", "b, "ba", "ab", "bb", "abb"의 6가지 다른 시퀀스가 있으므로 6이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
add() 함수를 정의하면, b,
-
return ((a mod MOD) + (b mod MOD)) mod MOD
-
함수 sub()를 정의하면, b,
-
return (((a mod MOD) - (b mod MOD)) + MOD) mod MOD
-
mul() 함수를 정의하면, b,
-
return ((a mod MOD) * (b mod MOD)) mod MOD
-
주요 방법에서 다음과 같이 -
-
n :=s
의 크기 -
크기가 26인 배열 dp를 정의합니다.
-
해상도 :=0
-
s :=s 앞에 공백 연결
-
initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −
-
x :=s[i]
-
추가됨 :=sub(add(res, 1), dp[x - 'a'])
-
dp[x - 'a'] =add(dp[x - 'a'], 추가됨)
-
res :=add(res, 추가됨)
-
-
반환 해상도
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli MOD = 1e9 + 7;
class Solution {
public:
lli add(lli a, lli b){
return ( (a % MOD) + (b % MOD) ) % MOD;
}
lli sub(lli a, lli b){
return ( ( (a % MOD) - (b % MOD) ) + MOD ) % MOD;
}
lli mul(lli a, lli b){
return ( (a % MOD) * (b % MOD) ) % MOD;
}
int distinctSubseqII(string s) {
int n = s.size();
vector <lli> dp(26);
int res = 0;
s = " " + s;
for(lli i = 1; i <= n; i++){
char x = s[i];
int added = sub(add(res, 1) , dp[x - 'a']);
dp[x - 'a'] = add(dp[x - 'a'], added);
res = add(res, added);
}
return res;
}
};
main(){
Solution ob;
cout << (ob.distinctSubseqII("bab"));
} 입력
"bab"
출력
6