📌  相关文章
📜  在一个字符串,重新排列的字符,没有相邻的两个相同

📅  最后修改于: 2021-04-29 15:55:55             🧑  作者: Mango

鉴于反复字符的字符串,任务是在一个字符串,是两个相邻的字符是相同的重新排列字符。

注意:可以假定该字符串仅包含小写英文字母。

例子:

Input: aaabc 
Output: abaca 

Input: aaabb
Output: ababa 

Input: aa 
Output: Not Possible

Input: aaaabc 
Output: Not Possible

询问:亚马逊采访

先决条件:priority_queue。

这个想法是要把频率最高的字符放在首位(贪婪的方法)。我们使用优先级队列(或Binary Max Heap)并将所有字符按其频率排序(最高频率字符位于根目录)。我们一一从堆中获取频率最高的字符,并将其添加到结果中。添加后,我们降低了字符的频率,并暂时将该字符移出优先级队列,以便下次不再选择它。

我们必须按照以下步骤解决此问题,它们是:
1.构建一个Priority_queue或max_heap, pq ,用于存储字符及其频率。
……Priority_queue或max_heap建立在字符频率的基础上。
2.创建一个临时键,该键将用作先前访问的元素(结果字符串的先前元素。对其进行初始化{char =’#’,freq =’-1′}
3.当pq不为空时。
…..弹出一个元素并将其添加到结果中。
…..将弹出元素的频率降低“ 1”
…..如果前一个元素的频率>’0’,则将其推回priority_queue
…..将当前元素作为下一个迭代的前一个元素。
4.如果结果字符串和原始字符串的长度不相等,则打印“不可能”。其他打印结果。

以下是上述想法的实现

C++
// C++ program to rearrange characters in a string
// so that no two adjacent characters are same.
#include
using namespace std;
  
const int MAX_CHAR = 26;
  
struct Key
{
    int freq; // store frequency of character
    char ch;
  
    // function for priority_queue to store Key
    // according to freq
    bool operator<(const Key &k) const
    {
        return freq < k.freq;
    }
};
  
// Function to rearrange character of a string
// so that no char repeat twice
void rearrangeString(string str)
{
    int n = str.length();
  
    // Store frequencies of all characters in string
    int count[MAX_CHAR] = {0};
    for (int i = 0 ; i < n ; i++)
        count[str[i]-'a']++;
  
    // Insert all characters with their frequencies
    // into a priority_queue
    priority_queue< Key > pq;
    for (char c = 'a' ; c <= 'z' ; c++)
        if (count[c-'a'])
            pq.push( Key { count[c-'a'], c} );
  
    // 'str' that will store resultant value
    str = "" ;
  
    // work as the previous visited element
    // initial previous element be. ( '#' and
    // it's frequency '-1' )
    Key prev {-1, '#'} ;
  
    // traverse queue
    while (!pq.empty())
    {
        // pop top element from queue and add it
        // to string.
        Key k = pq.top();
        pq.pop();
        str = str + k.ch;
  
        // IF frequency of previous character is less
        // than zero that means it is useless, we
        // need not to push it
        if (prev.freq > 0)
            pq.push(prev);
  
        // make current character as the previous 'char'
        // decrease frequency by 'one'
        (k.freq)--;
        prev = k;
    }
  
    // If length of the resultant string and original
    // string is not same then string is not valid
    if (n != str.length())
        cout << " Not valid String " << endl;
  
    else // valid string
        cout << str << endl;
}
  
// Driver program to test above function
int main()
{
    string str = "bbbaa" ;
    rearrangeString(str);
    return 0;
}


Java
// Java program to rearrange characters in a string
// so that no two adjacent characters are same.
import java.io.*;
import java.util.*;
  
class KeyComparator implements Comparator {
  
      // Overriding compare()method of Comparator
      public int compare(Key k1, Key k2)
      {
             if (k1.freq < k2.freq)
                 return 1;
             else if (k1.freq > k2.freq)
                 return -1;
             return 0;
      }
}
  
class Key {
      int freq; // store frequency of character
      char ch;
      Key(int val, char c) 
      {
          freq = val; 
          ch = c;
      }
}
  
class GFG {
      static int MAX_CHAR = 26; 
  
      // Function to rearrange character of a string
      // so that no char repeat twice
      static void rearrangeString(String str)
      {
             int n = str.length();
  
             // Store frequencies of all characters in string
             int[] count = new int[MAX_CHAR];
               
             for (int i = 0; i < n; i++)
                  count[str.charAt(i) - 'a']++;
  
              // Insert all characters with their frequencies
              // into a priority_queue 
              PriorityQueue pq = new PriorityQueue<>(new 
                                                          KeyComparator());
              for (char c = 'a'; c <= 'z'; c++) {
                   int val = c - 'a';
                   if (count[val] > 0)
                       pq.add(new Key(count[val], c));
              }
                   
              // 'str' that will store resultant value
              str = "" ;
  
              // work as the previous visited element
              // initial previous element be. ( '#' and
              // it's frequency '-1' )
              Key prev = new Key(-1, '#');
  
              // traverse queue
              while (pq.size() != 0) {
                
                     // pop top element from queue and add it
                     // to string.
                     Key k = pq.peek();
                     pq.poll();
                     str = str + k.ch;
  
                     // If frequency of previous character is less
                     // than zero that means it is useless, we
                     // need not to push it 
                     if (prev.freq > 0)
                         pq.add(prev);
  
                     // make current character as the previous 'char'
                     // decrease frequency by 'one'
                     (k.freq)--;
                      prev = k;
              }
  
              // If length of the resultant string and original
              // string is not same then string is not valid
              if (n != str.length())
                  System.out.println(" Not valid String ");
              else
                  System.out.println(str);
      }
  
      // Driver program to test above function 
      public static void main(String args[])
      {
             String str = "bbbaa" ;
             rearrangeString(str);
      }
}
  
// This code is contributed by rachana soma


输出:

babab

时间复杂度: O(nlog(n))