เราสามารถจัดเรียงอักขระของสตริงในลำดับที่ต่างกันได้ ในที่นี้เราจะมาดูกันว่าเราจะนับจำนวนการเรียงสับเปลี่ยนได้อย่างไรจากสตริงที่กำหนด
เรารู้ว่าถ้าหนึ่งสตริงคือ '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