주어진 문자열이 있으며 모음과 자음이 대체 위치를 차지하도록 문자열의 문자를 재배열합니다. 위와 같은 방법으로 문자열을 재배열할 수 없다면 "not possible"을 출력하세요.
모음의 순서와 자음의 순서는 반드시 지켜져야 합니다.
Input: abce Output: abec
설명
-
문자열에서 모음과 자음의 개수를 찾습니다.
-
차이가 없는 경우. 모음과 자음이 하나 이상인 경우 "불가능"을 반환합니다.
-
문자열에 자음보다 모음이 더 많은 조건이 있는 경우 첫 번째 모음을 먼저 인쇄하고 나머지 문자열에 대해 반복합니다.
-
문자열에 모음보다 자음이 더 많은 조건이 있는 경우 첫 번째 자음을 먼저 인쇄하고 나머지 문자열에 대해 반복합니다.
-
아니오. 모음과 자음의 개수가 같으면 첫 번째 모음과 첫 번째 자음을 비교하여 작은 것을 먼저 인쇄합니다.
예
#include <iostream>
using namespace std;
bool isVowel(char ch) {
if (ch == 'a' || ch == 'e' || ch == 'i' ||
ch == 'o' || ch =='u')
return true;
return false;
}
string createAltStr(string str1, string str2,
int start, int l) {
string finalStr = "";
for (int i=0, j=start; j<l; i++, j++)
finalStr = (finalStr + str1.at(i)) + str2.at(j);
return finalStr;
}
string findAltStr(string str) {
int nv = 0, nc = 0;
string vstr = "", cstr = "";
int l = str.size();
for (int i=0; i<l; i++) {
char ch = str.at(i);
if (isVowel(ch)) {
nv++;
vstr = vstr + ch;
} else {
nc++;
cstr = cstr + ch;
}
}
if (abs(nv-nc) >= 2)
return "no such string";
if (nv > nc)
return (vstr.at(0) + createAltStr(cstr, vstr, 1, nv));
if (nc > nv)
return (cstr.at(0) + createAltStr(vstr, cstr, 1, nc));
if (cstr.at(0) < vstr.at(0))
return createAltStr(cstr, vstr, 0, nv);
return createAltStr(vstr, cstr, 0, nc);
}
int main() {
string str = "abde";
cout << findAltStr(str);
return 0;
}