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

โปรแกรม C++ เพื่อค้นหาจำนวนการเรียงสับเปลี่ยนของสตริงที่กำหนด


เราสามารถจัดเรียงอักขระของสตริงในลำดับที่ต่างกันได้ ในที่นี้เราจะมาดูกันว่าเราจะนับจำนวนการเรียงสับเปลี่ยนได้อย่างไรจากสตริงที่กำหนด

เรารู้ว่าถ้าหนึ่งสตริงคือ 'abc' มีสามตัวอักษร; เราสามารถจัดเป็น 3 ได้! =6 วิธีที่แตกต่างกัน ดังนั้นสตริงที่มีอักขระ n ตัว เราสามารถจัดเรียงพวกมันเป็น n ได้! วิธีทางที่แตกต่าง. แต่ตอนนี้หากมีอักขระที่เหมือนกันหลายครั้ง เช่น aab จะไม่มีการเรียงสับเปลี่ยน 6 ครั้ง

  • อบา
  • aab
  • บ้า
  • บ้า
  • aab
  • อบา

ที่นี่ (1,6), (2, 5), (3,4) เหมือนกัน ดังนั้นจำนวนการเรียงสับเปลี่ยนคือ 3 โดยพื้นฐานแล้ว (n!)/(ผลรวมของแฟกทอเรียลของอักขระทั้งหมดที่เกิดขึ้นมากกว่าหนึ่งครั้ง)

ในการแก้ปัญหานี้ ก่อนอื่นเราต้องคำนวณความถี่ของอักขระทั้งหมด จากนั้นนับแฟกทอเรียลของ n แล้วหารด้วยผลรวมของค่าความถี่ทั้งหมดที่มากกว่า 1

โค้ดตัวอย่าง

#include<iostream>
using namespace std;
long fact(long n) {
   if(n == 0 || n == 1 )
      return 1;
   return n*fact(n-1);
}
int countPermutation(string str) {
   int freq[26] = {0};
   for(int i = 0; i<str.size(); i++) {
      freq[str[i] - 'a']++; //get the frequency of each characters individually
   }
   int res = fact(str.size()); //n! for string of length n
   for(int i = 0; i<26; i++) {
      if(freq[i] > 1)
         res /= fact(freq[i]); //divide n! by (number of occurrences of each characters)!
   }
   return res;
}
main(){
   string n;
   cout << "Enter a number to count number of permutations can be possible: ";
   cin >> n;
   cout << "\nThe number of permutations: " << countPermutation(n);
}

ผลลัพธ์

Enter a number to count number of permutations can be possible: abbc
The number of permutations: 12