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

C++의 대체 하위 상위 문자열 정렬

<시간/>

문자열은 문자 배열입니다. . 그리고 이 문제는 문자열의 요소를 대소문자를 번갈아 가며 정렬하는 것입니다.

문제 설명 - 대체 하위 상위 문자열 정렬은 대문자와 소문자가 혼합된 정렬되지 않은 문자열이 제공되고 대문자와 소문자가 대체 위치에 배치되지만 다음 위치에 있는 방식으로 이 문자열을 정렬해야 하는 문제입니다. 정렬된 방식입니다.

주제를 더 잘 이해하기 위해 예를 들어 보겠습니다.

Input : aFegrAfStRzsV
Output : AaFeRfSgVrstz
Explanation :
Upper case characters : A F R S V
Lower case characters : a e f g r s t z

둘 다 정렬 방식으로 되어 있으므로 이제 다른 순서로 배치할 수 있습니다.

이제 문제를 이해했으므로. 이에 대한 솔루션을 만들어 보겠습니다. 한 가지 방법은 대문자와 소문자 모두에 대한 배열을 정렬된 순서로 만든 다음 최종 문자열에서 교대로 만드는 것입니다. 이 논리를 기반으로 알고리즘을 만들었습니다.

알고리즘

Step 1 : In an array lowercount[] add all lowercase characters in sorted order.
Step 2 : In an array uppercount[] add all uppercase characters in sorted order.
Step 3 : Create the final string using alternate values from both arrays.
Step 4 : Print the result array.

#include <iostream>
using namespace std;
#define MAX 26
void alternateULSort(string& s) ;
int main(){
   string str = "aFegrAfStRzsV";
   cout<<"The unsorted string is : "<<str;
   cout<<"\nThe alternate lower upper sorted string is ";
   alternateULSort(str);
   cout << str << "\n";
}
void alternateULSort(string& s){
   int n = s.length();
   int lowerCount[MAX] = { 0 }, upperCount[MAX] = { 0 };
   for (int i = 0; i < n; i++) {
      if (isupper(s[i]))
         upperCount[s[i] - 'A']++;
      else
         lowerCount[s[i] - 'a']++;
   }
   int i = 0, j = 0, k = 0;
   while (k < n) {
      while (i < MAX && upperCount[i] == 0)
         i++;
      if (i < MAX) {
         s[k++] = 'A' + i;
         upperCount[i]--;
         }
      while (j < MAX && lowerCount[j] == 0)
         j++;
      if (j < MAX) {
         s[k++] = 'a' + j;
         lowerCount[j]--;
      }
   }
}

출력

The unsorted string is : aFegrAfStRzsV
The alternate lower upper sorted string is AaFeRfSgVrstz