Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลำดับย่อยที่แตกต่าง II ใน C ++


สมมติว่าเรามีสตริง 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