문자열 S가 있다고 가정하고 서로 인접한 두 문자가 동일하지 않도록 문자를 재배열할 수 있는지 확인합니다. 가능한 경우 가능한 결과를 출력하십시오. 이것이 불가능하면 빈 문자열을 반환합니다. 따라서 입력이 "AAB"와 같으면 출력은 "ABA"가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- pq라는 정수 문자 쌍의 우선 순위 큐를 만들고 하나의 맵 m을 정의합니다.
- n :=문자열의 크기
- 맵 m에 문자 빈도 저장
- m
- 의 각 키-값 쌍 p에 대해
- 삽입(p의 정수 부분, p의 문자 부분)
- ans :=빈 문자열
- pq가 비어 있지 않은 동안
- 1 :=pq에서 상위 쌍을 설정하고 pq에서 상위 쌍을 삭제합니다.
- pq가 비어 있으면
- 1의 정수 부분> 1이면 빈 문자열을 반환합니다.
- ans :=as + 하나의 문자 부분
- 반환
- two :=pq에서 최상위 쌍, pq에서 최상위 쌍 삭제
- ans :=as + 하나의 문자 부분
- ans :=ans + 2의 문자 부분
- 1과 2의 정수 부분을 1씩 증가
- 1의 정수 부분이 0이 아니면 pq에 1을 삽입
- 2의 정수 부분이 0이 아니면 pq에 1을 삽입
- 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: string reorganizeString(string S) { priority_queue <pair <int, char>> pq; map <char, int> m; int n = S.size(); for(int i = 0; i < n; i++){ m[S[i]]++; } map <char, int> :: iterator i = m.begin(); while(i != m.end()){ pq.push({i->second, i->first}); i++; } string ans = ""; while(!pq.empty()){ pair <int, char> one = pq.top(); pq.pop(); if(pq.empty()){ if(one.first > 1) return ""; ans += one.second; return ans; } pair <int, char> two = pq.top(); pq.pop(); ans += one.second; ans += two.second; //cout << ans << endl; one.first--; two.first--; if(one.first)pq.push(one); if(two.first)pq.push(two); } return ans; } }; int main() { Solution ob1; cout << ob1.reorganizeString("AAB") << endl; return 0; }
입력
S = "AAB" ob1.reorganizeString("AAB")
출력
ABA