题目:
解答:
优先队列,根据字母数量进行排序。
(1)记录每个字母在字符串中的数量(哈希表);
(2)根据字母数量降序排序(插入优先队列,以字母数量较大优先级较高,类似于大顶堆)
(3)若队列顶部字母的数量大于一半则无法构造,直接返回空字符串(奇偶有别)
(4)按照字母数量降序顺序,当队列不空时,依次按照对顶元素,隔着往原字符串插入当前字符,下标从 0 开始,每次插入下标 +2,当超过数组大小时,变为 1。
1 class Solution { 2 public: 3 struct elm 4 { 5 char alp; 6 int cnt; 7 friend bool operator <(elm a,elm b) 8 { 9 return a.cnt<b.cnt; 10 } 11 }; 12 13 public: 14 string reorganizeString(string S) 15 { 16 priority_queue<elm> q; 17 18 unordered_map<char,int> mp; 19 20 for(auto s:S) 21 { 22 mp[s]++; 23 } 24 25 for(auto p:mp) 26 { 27 elm t; 28 t.alp=p.first; 29 t.cnt=p.second; 30 q.push(t); 31 } 32 33 int i=q.top().cnt; 34 if(S.size() % 2 && i > S.size() / 2 + 1) 35 { 36 return ""; 37 } 38 39 if(S.size() % 2 == 0 && i > S.size() / 2) 40 { 41 return ""; 42 } 43 i=0; 44 while(!q.empty()) 45 { 46 char t=q.top().alp; 47 int k=q.top().cnt; 48 while(k--) 49 { 50 if(i>=S.size()) 51 { 52 i=1; 53 } 54 S[i]=t; 55 i+=2; 56 } 57 q.pop(); 58 } 59 return S; 60 } 61 };