给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。
解1:遍历字符串将频率存入umap,遍历umap,发现有元素出现超过((len + 1)/2)则输出“”,用pque对出现次数排序输出到一个字符串(“baa”—>“aab”),遍历这个字符串先填奇数位置,再填偶数位置。
class Solution {
public:
string reorganizeString(string S) {
unordered_map<char, int> umap;
priority_queue<pair<char, int>, vector<pair<char, int> >, mycmp> pque;
for (int i = 0; i < S.size(); i++) {
umap[S[i]]++;
}
for (unordered_map<char, int>::iterator it = umap.begin(); it != umap.end(); it++) {
if ((*it).second > (S.size() + 1) / 2) return "";
pque.push(*it);
}
string tem = "";
while (!pque.empty()) {
char c = pque.top().first; int count = pque.top().second;
pque.pop();
for (int i = 0; i < count; i++) {
tem += c;
}
}
int i = 0, j = 0;
for ( ; j < res.size() && i < S.size(); j++) {
S[i] = res[j];
i += 2;
}
i = 1;
for ( ; j < res.size() && i < S.size(); j++) {
S[i] = res[j];
i += 2;
}
return S;
}
private:
class mycmp{
public:
bool operator() (pair<char, int> &p1, pair<char, int> &p2) {
return p1.second < p2.second;
}
};
};
解2:用sort对次数进行排序
class Solution {
public:
string reorganizeString(string S) {
unordered_map<char, int> umap;
vector<pair<char, int> > vec;
string tem;
for (int i = 0; i < S.size(); i++) {
umap[S[i]]++;
}
for (unordered_map<char, int>::iterator it = umap.begin(); it != umap.end(); it++) {
if ((*it).second > (S.size() + 1) / 2) return "";
vec.push_back(*it);
}
sort(vec.begin(), vec.end(), cmp);
for (int i = 0; i < vec.size(); i++) {
for (int j = 0; j < vec[i].second; j++) {
tem += vec[i].first;
}
}
int i = 0, k = 0;//注!!要分清楚哪个指针是遍历哪个的
for (; i < tem.size() && k < tem.size(); i++) {
S[k] = tem[i];
k += 2;
}
k = 1;
for (; i < tem.size() && k < tem.size(); i++) {
S[k] = tem[i];
k += 2;
}
return S;
}
private:
static bool cmp(pair<char, int> &p1, pair<char, int> &p2) {
return p1.second > p2.second;
}
};