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

ค้นหาจำนวนการเรียงสับเปลี่ยนที่ไม่ซ้ำที่เริ่มต้นด้วย 1 ของสตริงไบนารีโดยใช้ C++


ในปัญหาที่กำหนด เราได้รับสตริงที่ประกอบด้วย 0 และ 1 เราจะต้องค้นหาจำนวนการเรียงสับเปลี่ยนทั้งหมดเพื่อให้สตริงเริ่มต้นด้วย 1 เนื่องจากคำตอบอาจมีจำนวนมหาศาล เราจึงพิมพ์เป็นม็อดที่มี 100,000,000,000

Input : str ="10101001001"
Output : 210

Input : str ="101110011"
Output : 56

เราจะแก้ปัญหานี้โดยการใช้ combinatorics และสร้างสูตรขึ้นมาเพื่อแก้ปัญหานี้

แนวทางในการหาทางออก

ในแนวทางนี้ เราจะคำนวณจำนวน 0 และ 1 ทีนี้ สมมุติว่า n คือจำนวน 1 ที่มีอยู่ในสตริงของเรา และ m เป็นจำนวน 0 ที่มีอยู่ในสตริงของเรา และให้ L เป็นความยาวของสตริงที่เรากำหนด ดังนั้นสูตรที่เราทำเพื่อแก้ปัญหานี้คือ (L-1 )!/ (n-1)! * ม!.

ตัวอย่าง

#include <bits/stdc++.h>
#define MOD 1000000007 // defining 1e9 + 7 as MOD

using namespace std;

long long fact(long long n) {
   if(n <= 1)
   return 1;
   return ((n % MOD) * (fact(n-1) % MOD)) % MOD;
}
int main() {
   string s = "101110011";
   long long L = s.size(); // length of given string
   long long count_1 = 0, count_0 = 0; // keeping count of 1's and 0's
   for(auto x : s) {
      if(x == '1')
         count_1++; // frequency of 1's
      else
        count_0++; // frequency of 0's
   }
   if(count_1 == 0){
      cout << "0\n"; // if string only consists of 0's so our answer will be 0
   } else {
      long long factL = fact(L-1); // (L-1)!
      long long factn = fact(count_1 - 1); // (n-1)!
      long long factm = fact(count_0); // m!
      long long ans = factL / (factn * factm); // putting the formula
      cout << ans << "\n";
   }
   return 0;
}

ผลลัพธ์

56

โปรแกรมที่กำหนดมีเวลาซับซ้อนของ O(N) โดยที่ n คือความยาวของสตริงที่เรากำหนด

คำอธิบายของโค้ดด้านบน

ในแนวทางนี้ เรากำลังนับจำนวน 1 และ 0 ที่มีอยู่ในสตริงของเราตอนนี้ เราวางหนึ่งไว้ที่จุดเริ่มต้น และตอนนี้กำหนดพีชคณิตที่เป็นไปได้ทั้งหมดของ 0 และ 1 ในสตริงของความยาว L-1 ดังนั้นโดยการกำหนดนี้เรา ได้สูตรของ (L-1)! / (n-1)! * ม! ที่ไหน (n-1)! คือพีชคณิตของ 1 ที่เหลือและ m! คือการเปลี่ยนแปลงของ 0

บทสรุป

ในบทความนี้ เราแก้ปัญหาเพื่อค้นหาจำนวนการเรียงสับเปลี่ยนที่ไม่ซ้ำกันโดยเริ่มจาก 1 สตริงไบนารีโดยใช้ combinatorics และสร้างสูตรขึ้นมา

นอกจากนี้เรายังได้เรียนรู้โปรแกรม C ++ สำหรับปัญหานี้และแนวทางที่สมบูรณ์ ( Normal) ซึ่งเราแก้ไขปัญหานี้ เราสามารถเขียนโปรแกรมเดียวกันในภาษาอื่นๆ เช่น C, java, python และภาษาอื่นๆ เราหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์