กำหนดสตริงความยาว n (<10) หาจำนวนวิธีจัดเรียงใหม่ โดยที่ตำแหน่งของสระและพยัญชนะต้องคงที่ (สระอยู่เดิม พยัญชนะอยู่เดิม)
วิธีคำนวณ
- นับจำนวนสระ (v) และพยัญชนะ (c)
- หาจำนวนวิธีจัดเรียงสระ: v! / (freqแต่ละสระ!)
- หาจำนวนวิธีจัดเรียงพยัญชนะ: c! / (freqแต่ละพยัญชนะ!)
- คูณทั้งสองค่า
โค้ดตัวอย่าง (C++)
#include <iostream>
using namespace std;
long long fact(int n) {
if (n <= 1) return 1;
return n * fact(n-1);
}
long long countArrangements(string str) {
long long freq[26] = {0};
int v = 0, c = 0;
for (char ch : str) {
freq[ch-'a']++;
if (ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u') v++;
else c++;
}
long long vow = fact(v);
vow /= fact(freq[0]); // a
vow /= fact(freq[4]); // e
vow /= fact(freq[8]); // i
vow /= fact(freq[14]); // o
vow /= fact(freq[20]); // u
long long con = fact(c);
for (int i=0;i<26;i++)
if (i!=0&&i!=4&&i!=8&&i!=14&&i!=20) con /= fact(freq[i]);
return vow * con;
}
int main() {
string str = "computer";
cout << "Ways: " << countArrangements(str);
return 0;
}
ผลลัพธ์
Ways: 720