Cho chuỗi đầu vào chứa nguyên âm và phụ âm. Sắp xếp lại chuỗi sao cho nguyên âm và phụ âm chiếm vị trí xen kẽ trong chuỗi kết quả. Đầu vào phải thỏa mãn một trong các điều kiện:
Số nguyên âm và phụ âm bằng nhau, ví dụ "individual" có 5 nguyên âm, 5 phụ âm.
Nếu nguyên âm nhiều hơn, chênh lệch phải là 1, ví dụ "noe" có 2 nguyên âm, 1 phụ âm.
Nếu phụ âm nhiều hơn, chênh lệch phải là 1, ví dụ "objective" có 4 nguyên âm, 5 phụ âm.
Thuật toán
1. Đếm số nguyên âm 2. Đếm số phụ âm 3. Nếu chênh lệch > 1 thì báo lỗi 4. Tách chuỗi thành hai phần: a) Chuỗi chỉ chứa nguyên âm b) Chuỗi chỉ chứa phụ âm 5. Nếu số lượng bằng nhau, tạo chuỗi kết quả lấy lần lượt từ mỗi chuỗi. 6. Nếu nguyên âm nhiều hơn: a) Thêm nguyên âm thừa vào kết quả để hai chuỗi bằng dài b) Tạo chuỗi kết quả xen kẽ 7. Nếu phụ âm nhiều hơn: a) Thêm phụ âm thừa vào kết quả b) Tạo chuỗi kết quả xen kẽ
Ví dụ
#include <iostream>
#include <string>
using namespace std;
bool is_vowel(char ch) {
if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
return true;
return false;
}
string create_final_string(string &s1, string &s2, int start, int end) {
string final_string;
for (int i = 0, j = start; j < end; ++i, ++j)
final_string = (final_string + s1.at(i)) + s2.at(j);
return final_string;
}
string create_alternate_string(string &s) {
int vowel_cnt, consonant_cnt;
string vowel_str, consonant_str;
vowel_cnt = consonant_cnt = 0;
for (char c : s) {
if (is_vowel(c)) {
++vowel_cnt;
vowel_str += c;
} else {
++consonant_cnt;
consonant_str += c;
}
}
if (abs(consonant_cnt - vowel_cnt) >= 2) {
cerr << "Khong the tao chuoi xen ke nguyen am phu am\n";
exit(1);
}
if ((consonant_cnt - vowel_cnt) == 0)
return create_final_string(vowel_str, consonant_str, 0, vowel_cnt);
else if (vowel_cnt > consonant_cnt)
return vowel_str.at(0) + create_final_string(consonant_str, vowel_str, 1, vowel_cnt);
return consonant_str.at(0) + create_final_string(vowel_str, consonant_str, 1, consonant_cnt);
}
int main() {
string s1 = "individual";
string s2 = "noe";
string s3 = "objective";
cout << "Input: " << s1 << "\n";
cout << "Output: " << create_alternate_string(s1) << "\n\n";
cout << "Input: " << s2 << "\n";
cout << "Output: " << create_alternate_string(s2) << "\n\n";
cout << "Input: " << s3 << "\n";
cout << "Output: " << create_alternate_string(s3) << "\n\n";
}
Kết quả
Khi biên dịch và chạy code trên, đầu ra:
Input: individual Output: inidivudal Input: noe Output: one Input: objective Output: bojecitev