Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 가능한 경우 회문을 형성하도록 문자를 재배열하십시오.

<시간/>

주어진 길이의 문자열 'str'이 제공됩니다. 작업은 주어진 입력 문자열에서 문자를 추가하거나 제거하지 않고 출력이 회문 문자열이 되는 방식으로 문자를 재배열하는 것입니다. 회문 문자열은 처음과 끝에서 발음이 같도록 문자를 배열한 것입니다.

여기에 대한 다양한 입력 출력 시나리오를 살펴보겠습니다 -

입력 - 문자열 str ="itnin"

출력 − 가능한 경우 회문을 형성하기 위한 문자 재배열:nitin

설명 − 문자열 유형 변수가 주어진다고 가정해 봅시다. str. 이제 우리는 회문 문자열이 되는 방식으로 입력 문자열의 문자를 재배열하고 이것이 불가능하면 'NOT POSSIBLE'을 반환합니다. 따라서 주어진 입력 문자열의 출력은 'nitin'입니다.

입력 - 문자열 str ="바아바"

출력 − 가능한 경우 회문을 형성하기 위한 문자 재배열:aabbaa

설명 − 문자열 유형 변수가 주어진다고 가정해 봅시다. str. 이제 회문 문자열이 되는 방식으로 입력 문자열의 문자를 재배열하고 이것이 불가능하면 'NOT POSSIBLE'을 반환합니다. 따라서 주어진 입력 문자열의 출력은 'aabbaa'입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • string형의 변수, 예를 들어 str을 입력하고 string의 크기를 계산하여 variable이라는 이름의 길이에 저장합니다.

  • 데이터를 재배열(str, length) 함수에 전달합니다.

  • 함수 내부 재정렬(arr, length)

    • char 및 정수 유형 쌍을 저장하는 unordered_map 유형의 변수 'um'을 만듭니다.

    • 정수형 변수를 total로 선언하고 0으로 설정합니다.

    • 문자형 변수를 'ch'로, 문자열형 변수를 str_1, str_2로 생성합니다.

    • i가 길이보다 작을 때까지 루프 FOR를 i에서 0으로 시작합니다. 루프 내에서 um[str[i]]를 증분 값 1로 설정합니다.

    • 루프 FOR를 시작하여 맵 'um'을 반복합니다. 루프 내에서 IF it.second % 2가 0이 아닌지 확인한 다음 합계를 1씩 증가시키고 it.first로 ch를 설정합니다.

    • 총계가 1보다 큰지 또는 총계 =1 AND 길이 % 2 =0인지 확인한 다음 0을 반환하십시오.

    • 루프 FOR를 시작하여 맵 'um'을 반복합니다. 루프 내에서 str(it.second / 2, it.first), str_1을 str_1 + str로, str_2를 str + str_2로 설정합니다.

    • IF total =1을 확인한 다음 str_1 + ch + str_2를 반환합니다. 그렇지 않으면 str_1 + str_2를 반환합니다.

  • 결과를 인쇄하십시오.

예시

#include <bits/stdc++.h>
using namespace std;
string Rearrangement(string str, int length){
   unordered_map<char, int> um;
   int total = 0;
   char ch;
   string str_1 = "";
   string str_2 = "";

   for (int i = 0; i < length; i++){
      um[str[i]]++;
   }
   for(auto it : um){
      if(it.second % 2 != 0){
         total++;
         ch = it.first;
      }
   }
   if(total > 1 || total == 1 && length % 2 == 0){
      return 0;
   }
   for(auto it : um){
      string str(it.second / 2, it.first);
      str_1 = str_1 + str;
      str_2 = str + str_2;
   }
   if(total == 1){
      return str_1 + ch + str_2;
   }
   else{
      return str_1 + str_2;
   }
}
int main(){
   string str = "itnin";
   int length = str.size();
   cout<<"Rearrangement of characters to form palindrome if possible is: "<<Rearrangement(str, length);
   return 0;
}

출력

위의 코드를 실행하면 다음과 같은 출력이 생성됩니다.

Rearrangement of characters to form palindrome if possible is: nitin