문자열이 주어지면 작업은 주어진 문자열에 있는 모든 모음을 뒤집는 것입니다. 예를 들어,
입력-1 -
a = “tutor”
출력 -
totur
설명 − 문자열 "tutor"를 반대로 하면 출력이 "totur.
로 생성됩니다.입력-2 -
a = “mathematics”
출력 -
mithametacs
설명 − 문자열 "mathematics"를 반대로 하면 "mithametacs"로 출력이 생성됩니다.
이 문제를 해결하기 위한 접근 방식
문자열이 주어지면 그 안에 있는 모든 모음을 반대로 바꿔야 합니다. 이 특정 문제를 해결하는 방법에는 여러 가지가 있지만 선형 시간 O(n)에서 해결해야 합니다.
따라서 이 문제를 해결하는 더 좋은 방법은 처음에 맨 왼쪽 요소와 맨 오른쪽 요소를 가리키는 두 개의 포인터를 low와 high로 취하는 Two-Pointer 접근 방식을 사용하는 것입니다. 두 개의 중첩 루프에서 맨 왼쪽 문자가 모음이고 맨 오른쪽 문자도 모음인지 확인한 다음 요소를 바꾸고 오른쪽 포인터를 이동합니다.
-
문자열을 입력하세요.
-
문자가 모음인지 확인하는 부울 함수입니다.
-
reverseVowel(string &str) 함수는 문자열을 입력으로 받아 문자열에 있는 모음을 반전시킵니다.
-
각각 '0'과 마지막 문자를 가리키는 두 개의 포인터를 low와 high로 초기화합니다.
-
맨 왼쪽과 맨 오른쪽 문자가 모음인지 확인한 다음 문자를 제자리에서 바꾸고 맨 오른쪽 포인터를 감소시킵니다.
-
문자열의 모든 문자를 방문하지 않을 때까지 단계를 반복합니다.
예시
#include <bits/stdc++.h> using namespace std; bool isVowel(char ch) { return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U'; } string reverseVowel(string &s){ int low = 0; int high = s.size() - 1; while (low < high) { while (low < high && !isVowel(s[low])) { low ++; } while (low < high && !isVowel(s[high])) { high --; } swap(s[low++], s[high--]); } return s; } int main(){ string a= "tutorialspoint"; string ans= reverseVowel(a); cout<<ans; return 0; }
출력
위의 코드를 실행하면 다음과 같이 출력이 생성됩니다.
titorailspount
주어진 문자열 "tutorialspoint"에는 모음이 포함되어 있으므로 모음을 반대로 하면 "titorailspount"로 출력됩니다.