สมมติว่าเรามีสตริง S เราต้องนับจำนวนลำดับย่อยที่แตกต่างกันของ S ผลลัพธ์อาจมีขนาดใหญ่ ดังนั้นเราจะส่งคืนคำตอบ modulo 10^9 + 7
ดังนั้น ถ้าอินพุตเป็นเหมือน "bab" ผลลัพธ์จะเป็น 6 เนื่องจากมี 6 ลำดับที่แตกต่างกัน ซึ่งได้แก่ "a", "b, "ba", "ab", "bb", "abb"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน add() ซึ่งจะใช้เวลา a, b,
-
return ((mod MOD) + (b mod MOD)) mod MOD
-
กำหนดฟังก์ชั่นย่อย () สิ่งนี้จะใช้เวลา a, b,
-
return (((a mod MOD) - (b mod MOD)) + MOD) mod MOD
-
กำหนดฟังก์ชัน mul() ซึ่งจะใช้ a, b,
-
กลับมา ((mod MOD) * (b mod MOD)) mod MOD
-
จากวิธีหลักดังนี้ −
-
n :=ขนาดของ s
-
กำหนดอาร์เรย์ dp ขนาด 26
-
res :=0
-
s :=เชื่อมช่องว่างก่อน s
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
x :=s[i]
-
เพิ่ม :=sub(add(res, 1), dp[x - 'a'])
-
dp[x - 'a'] =เพิ่ม (dp[x - 'a'], เพิ่ม)
-
res :=เพิ่ม (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