鉴于反复字符的字符串,任务是在一个字符串,是两个相邻的字符是相同的重新排列字符。
注意:可以假定该字符串仅包含小写英文字母。
例子:
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))