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

C++에서 회문 부분 문자열의 수를 최대화하도록 문자열을 다시 정렬합니다.

<시간/>

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

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

입력 - 문자열 str ="itnin"

출력 − 회문 부분 문자열의 수를 최대화하기 위한 문자열 재배열:iinnt.

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

입력 - 문자열 str ="abaaaabb"

출력 - 회문 부분 문자열의 수를 최대화하기 위한 문자열 재배열:aaaaabbb.

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

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

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

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

  • 함수 내부에서 Rearr_string(str, length)

    • arr[26]과 같이 크기가 26인 정수 유형의 배열을 선언하고 0으로 초기화합니다.

    • 문자열 유형의 임시 변수 'temp'를 선언합니다.

    • i가 길이보다 작을 때까지 루프 FOR를 i에서 0으로 시작합니다. 루프 내에서 arr[str[i] - 'a']++를 설정합니다.

    • i에서 0까지 FOR 루프를 시작하여 i가 26보다 작을 때까지. 루프 내에서 j가 arr[i]보다 작을 때까지 j에서 0까지 다른 루프 FOR를 시작합니다. 루프 내에서 temp를 temp + (char)(97 + i)로 설정합니다.

    • 반환 온도.

  • 결과를 인쇄하십시오.

예시

#include <bits/stdc++.h>
using namespace std;
string Rearr_string(string str, int length){
   int arr[26] = { 0 };
   string temp = "";
   for(int i = 0; i < length; i++){
      arr[str[i] - 'a']++;
   }
   for(int i = 0; i < 26; i++){
      for(int j = 0; j < arr[i]; j++){
         temp = temp + (char)(97 + i);
      }
   }
   return temp;
}
int main(){
   string str = "itinn";
   int length = str.length();
   cout<<"Rearrangement of the string to maximize the number of palindromic substrings is: "<<Rearr_string(str, length);
   return 0;
}

출력

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

Rearrangement of the string to maximize the number of palindromic substrings is: iinnt