码迷,mamicode.com
首页 > 其他好文 > 详细

【字符串】767. 重构字符串

时间:2020-05-04 13:23:15      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:无法   +=   for   开始   idt   friend   auto   col   超过   

题目:

技术图片

 

 

解答:

优先队列,根据字母数量进行排序。

(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 };

 

【字符串】767. 重构字符串

标签:无法   +=   for   开始   idt   friend   auto   col   超过   

原文地址:https://www.cnblogs.com/ocpc/p/12826166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!