在C ++中重组字符串

假设我们有一个字符串S,请检查是否可以重新排列字母,以使彼此相邻的两个字符不同。如果可能,输出任何可能的结果。如果不可能,则返回空字符串。因此,如果输入像“ AAB”,那么输出将是“ ABA”。

为了解决这个问题,我们将遵循以下步骤-

  • 创建一个称为pq的整数字符对的优先级队列,定义一个映射m

  • n:=字符串的大小

  • 将字符频率存储在映射m中

  • 对于m中的每个键值对p

    • 插入(p的整数部分,p的字符部分)

  • ans:=空字符串

  • 当pq不为空时

    • 如果整数部分> 1,则返回空字符串

    • ans:= ans +一个字符的一部分

    • 返回ans

    • 设置一个:= pq中的顶级对,并删除pq中的顶级对

    • 如果pq为空,则

    • 两个:=来自pq的顶部对,并删除来自pq的顶部对

    • ans:= ans +一个字符的一部分

    • ans:= ans +两个字符的一部分

    • 将一和二的整数部分加1

    • 如果1的整数部分不为0,则将1插入pq

    • 如果2的整数部分不为0,则将1插入pq

  • 返回ans

让我们看下面的实现以更好地理解-

示例

#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