767. 重构字符串
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
该题的算法是优先队列加贪心(优先队列的API真的记不住),下面是C++的代码:
class Solution {
public:
string reorganizeString(string S) {
if(S.length()<2) return S;
string result="";
vector<int> chMap(26,0);
int sLen=S.length();
int maxCount=0;
for (char i : S)
{
chMap[i-'a']++;
maxCount=max(maxCount,chMap[i-'a']);
}
if(maxCount>(sLen+1)/2) return "";
auto cmp = [&] (const char& char1, const char& char2){return chMap[char1-'a']<chMap[char2-'a'];};
priority_queue<char,vector<char>,decltype(cmp)> priQueue{cmp};
for(char i='a';i<='z';i++)
{
if(chMap[i-'a']>0) priQueue.push(i);
}
while(priQueue.size()>1)
{
char char1=priQueue.top();
priQueue.pop();
char char2=priQueue.top();
priQueue.pop();
result+=char1;
result+=char2;
if(--chMap[char1-'a']>0) priQueue.push(char1);
if(--chMap[char2-'a']>0) priQueue.push(char2);
}
if(priQueue.size()>0) result+=priQueue.top();
return result;
}
};
运行效果:
相同的思路Python代码如下:
class Solution:
def reorganizeString(self, S: str) -> str:
if len(S) < 2 : return S
sLen=len(S)
chaMap=collections.Counter(S)
maxCount=max(chaMap.items(),key=lambda x:x[1])[1]
if maxCount>(sLen+1)//2: return ""
priQueue=[(-x[1],x[0]) for x in chaMap.items()]
heapq.heapify(priQueue)
result=[]
while(len(priQueue)>1):
_,char1=heapq.heappop(priQueue)
_,char2=heapq.heappop(priQueue)
result.extend([char1,char2])
chaMap[char1]-=1
chaMap[char2]-=1
if chaMap[char1]>0: heapq.heappush(priQueue, (-chaMap[char1], char1))
if chaMap[char2]>0: heapq.heappush(priQueue, (-chaMap[char2], char2))
if len(priQueue)>0: result.append(priQueue[0][1])
return "".join(result)
运行效果:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reorganize-string