임의의 길이의 문자열이 주어진다고 가정해 봅시다. 작업은 결과 문자열에 함께 배열된 동일한 인접 문자가 없도록 주어진 문자열을 재배열하는 것입니다.
여기에 대한 다양한 입력 출력 시나리오를 살펴보겠습니다 -
입력 - 문자열 str ="itin"
출력 − 인접한 두 문자가 동일하지 않도록 문자열에서 문자를 재배열하는 것은 initn입니다.
설명 − 문자열 유형 변수가 주어진다고 가정해 봅시다. str. 이제 동일한 위치에 두 개의 동일한 문자가 발생하지 않는 방식으로 입력 문자열의 문자를 재배열합니다. 즉, 동일하고 서로 인접하기 때문에 'nn'을 이동합니다. 따라서 최종 문자열은 'initn'이 됩니다.
입력 - 문자열 str ="아바바바"
출력 − 인접한 두 문자가 동일하지 않도록 문자열에서 문자를 재배열하는 것은 다음과 같습니다. ababababa
설명 − 문자열 유형 변수가 주어진다고 가정해 봅시다. str. 이제 동일한 위치에 두 개의 동일한 문자가 발생하지 않는 방식으로 입력 문자열의 문자를 재배열합니다. 다른. 따라서 최종 문자열은 'ababababa'가 됩니다.
아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.
-
string형의 변수를 입력하고 str이라고 가정해 봅시다. 그리고 string의 크기를 계산하여 variable이라는 이름의 길이로 저장합니다.
-
길이가 0인지 확인한 다음 반환하십시오.
-
데이터를 재배열(str, length) 함수에 전달합니다.
-
함수 내부 재정렬(arr, length)
-
(길이 + 1)/2로 문자열의 크기를 설정합니다.
-
정수형 데이터를 저장할 벡터형 변수를 vec(26, 0)으로, string형의 ptr을 ptr(length, '')로 선언합니다. 정수 유형의 임시 변수는 0입니다.
-
루프 FOR를 시작하여 str을 반복합니다. 루프 내에서 vec[it - 'a']++를 설정합니다.
-
문자형 변수를 ch로 생성하고 maximum(vec) 함수를 호출하여 설정합니다.
-
정수형 변수를 total로 선언하고 vec[ch - 'a']로 설정합니다.
-
총계가 크기보다 큰 경우 확인 후 반환하십시오.
-
WHILE total 루프를 시작한 다음 ptr[temp]를 ch로 설정하고 temp를 temp + 2로 설정하고 합계를 1만큼 감소시킵니다.
-
vec[ch - 'a']를 0으로 설정합니다. 루프 FOR를 i에서 0으로 시작하여 i가 26보다 작을 때까지 합니다. 루프 내에서 vec[i]가 0보다 큰 동안 시작합니다. temp를 (temp> =length) 로 설정합니까? 1 :temp 및 ptr[temp]를 'a' + i로, temp를 temp + 2로 변경하고 vec[i]를 1만큼 감소시킵니다.
-
리턴 포인트
-
-
char maximum(const vector
함수 내부&vec) -
정수형 변수는 0까지, 문자형 변수는 'c'로 선언
-
루프 FOR를 i에서 0에서 26보다 작을 때까지 시작합니다. 루프 내에서 vec[i]가 high보다 작은지 확인한 다음 high를 vec[i]로, c를 'a' + i로 설정합니다.
-
반환 c
-
-
결과를 인쇄하십시오.
예
#include <bits/stdc++.h>
using namespace std;
char maximum(const vector<int>& vec){
int high = 0;
char c;
for(int i = 0; i < 26; i++){
if(vec[i] > high){
high = vec[i];
c = 'a' + i;
}
}
return c;
}
string Rearrangement(string str, int length){
int size = (length + 1) / 2;
vector<int> vec(26, 0);
string ptr(length, ' ');
int temp = 0;
for(auto it : str){
vec[it - 'a']++;
}
char ch = maximum(vec);
int total = vec[ch - 'a'];
if(total > size){
return "";
}
while(total){
ptr[temp] = ch;
temp = temp + 2;
total--;
}
vec[ch - 'a'] = 0;
for(int i = 0; i < 26; i++){
while (vec[i] > 0){
temp = (temp >= length) ? 1 : temp;
ptr[temp] = 'a' + i;
temp = temp + 2;
vec[i]--;
}
}
return ptr;
}
int main(){
string str = "itinn";
int length = str.length();
if(length == 0){
cout<<"Please enter a valid string";
}
string count = Rearrangement(str, length);
if(count == ""){
cout<<"Please enter a valid string";
}
else{
cout<<"Rearrangement of characters in a string such that no two adjacent are same is: "<<count;
}
return 0;
} 출력
위의 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Rearrangement of characters in a string such that no two adjacent are same is: initn