记录一道贪心算法的题目 -----重构字符串

Posted 卒然临之而不惊, 无故加之而不怒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一道贪心算法的题目 -----重构字符串相关的知识,希望对你有一定的参考价值。

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:

输入: S = "aab"
输出: "aba"
示例 2:

输入: S = "aaab"
输出: ""

分析:首先统计S中各个字符出现的次数,比如说实例1中,a:2,b:1,然后放到最大堆里,每次从中拿出出现次数最多的两个字符,输出字符。接着把字符出现次数减1,如果字符出现的次数仍然大于0,那么放回最大堆里去。重新选择出现次数最多的两个字符。最后,最大堆里面要么剩下一个元素,要么不剩元素,如果剩下的那个字符出现的次数大于1,那么题目中的要求达不到,如果字符出现次数为1,就要输出。

#include <map>
#include <string>
#include <queue>
#include <iostream>
#include <vector>

using namespace std;
// 自定义优先级队列排序规则
class mycomparison
{
bool reverse;
public:
  mycomparison(const bool& revparam=false)
    {reverse=revparam;}
  bool operator() (pair<char, int>& lhs, pair<char,int>&rhs) const
  {
    if (reverse) return (lhs.second > rhs.second);
    else return (lhs.second < rhs.second);
  }
};



class Solution {
public:
    string reorganizeString(string S) 
    {
        map<char, int> my_map;
        pair<char, int> temp1, temp2;
        string s = "";
        // 查找字符串次数
        int length = S.size();
        for(int i = 0; i < length; i++)
        {
            my_map[S[i]]++;
        }
        // 放入最大堆
        priority_queue<pair<char, int>,vector<pair<char,int>> ,mycomparison> max_heap;
        map<char, int>::iterator begin = my_map.begin();
        for(begin; begin != my_map.end(); begin++)
        {
            max_heap.push(*(begin)); 
        }
        // 弹出两个元素
        while(max_heap.size() > 1)
        {
            temp1 = max_heap.top();
            max_heap.pop();
            temp2 = max_heap.top();
            max_heap.pop();
            s = s + temp1.first + temp2.first;
            if(temp1.second >= 2)
            {
                //减1放回去
                temp1.second -= 1;
                max_heap.push(temp1);
            }
            if(temp2.second >= 2)
            {
                //减1放回去,重新调整顺序,优先级队列,好爽^-^
                temp2.second -= 1;
                max_heap.push(temp2);
            }
        }
        if (max_heap.size() == 1)
        {
          if (max_heap.top().second == 1)
          {
                s = s + max_heap.top().first;
          }
            else
            {
                s = "";
            }
        }
        return s;
    }
};

 

以上是关于记录一道贪心算法的题目 -----重构字符串的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法:分发饼干

挤奶问题,贪心算法的简单应用

LeetCode面试刷题技巧- 贪心算法题习题集

算法面试题贪心算法系列-无重叠区间

[力扣上岸] 如何用贪心算法解出大厂爱考的接雨水问题?

leetcode刷题-贪心算法(持续更新)