leetcode 767. 重构字符串
程序员文章站
2024-03-16 17:06:22
...
插空法
class Solution {
public:
string reorganizeString(string S) {
char result[S.size()+1];
int index = 0;
int chrCount[26]={0};
for(char &c:S){
chrCount[c-'a']++;
if(chrCount[c-'a']>(S.size()+1)/2) return "";
}
map<int,vector<char>,greater<int>> m;
for(int i=0;i<26;i++) m[chrCount[i]].push_back(i+'a');
for(auto a:m){
for(int j=0;j<a.second.size();j++){
for(int i=0;i<a.first;i++){
if(index>S.size()-1) index=1;
result[index] = (a.second)[j];
index+=2;
}
}
}
result[S.size()]=0;
return result;
}
};
最大堆
这个我是没有想到的,关键的一点就是利用贪心思想,又要满足题意要求,所以读取一个最大堆的顶端之后,要把它pop了,这样下一个字母就不会重复了,但是读取下一个字母之后,要再把它push进去,因为还没读完。
class Solution {
public:
string reorganizeString(string S) {
char result[S.size()+1];
int index = 0;
vector<int> charCount(26,0);
priority_queue<pair<int,char>> maxHeap;
for(char &c:S) {
charCount[c-'a']++;
if(charCount[c-'a']>(S.size()+1)/2) return "";
}
for(int i=0;i<26;i++)
if(charCount[i]!=0)
maxHeap.push(pair<int,char>(charCount[i],'a'+i));
pair<int,char> pre(0,' ');
while(!maxHeap.empty()){
pair<int,char> tmp = maxHeap.top();
maxHeap.pop();
if(pre.first!=0) maxHeap.push(pre);
pre.first = tmp.first-1;
pre.second = tmp.second;
result[index++] = tmp.second;
}
result[S.size()] = 0;
return result;
}
};
推荐阅读
-
leetcode 767. 重构字符串
-
LeetCode 767.重构字符串
-
LeetCode 767.重构字符串
-
[leetCode]767. 重构字符串
-
leetcode 767. 重构字符串
-
leetcode——767.重构字符串
-
leetcode 767.重构字符串
-
每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
-
LeetCode 151. 翻转字符串里的单词
-
LeetCode[字符串] - #3 Longest Substring Without Repeating Characters 博客分类: LeetCode LeetCodeJavaAlgorithm题解String