每日刷题笔记——leetcode 767. 重构字符串

今天的每日一题,我学到了一个新知识:pair

题目:767. 重构字符串

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:
输入: S = “aab”
输出: “aba”

示例 2:
输入: S = “aaab”
输出: “”

注意:
S 只包含小写字母并且长度在[1, 500]区间内。

题目理解:
贪心算法
计算每个字母出现的次数,只有满足出现次数最多的字母的个数小于等于(n+1)/2,才会使得两个相邻的字符不相同;所以我们首先会有一个筛选,如果出现次数最多的字母个数大于(n+1)/2,则可以返回空字符串;
如果满足两个相邻的字符不相同,则开始按照每个字符出现的次数进行从大到小的排序;依次读取字符,首先将其按照奇数位插入,读取到n位时,回到‘1’,从偶数位开始插入,则可以保证相邻的字符不同;
原解来自于:https://leetcode-cn.com/problems/reorganize-string/solution/zhong-gou-zi-fu-chuan-by-leetcode-solution/

class Solution {
    private:
    bool static cmp(const pair<int,int>& a, const pair<int,int>& b)
    {
        return a.second>b.second;
    }
public:
    string reorganizeString(string S) {
    int maxString=0;
    unordered_map<char,int> umap;
    for(auto s:S)
    {
         umap[s]++;
         maxString=max(maxString,umap[s]);
    }
    if(2*maxString>S.size()+1)
    return "";

    vector<pair<int,int>>vec(umap.begin(),umap.end());
    sort(vec.begin(),vec.end(),cmp);

    string result(S);
    int index=0;
    for(int i=0;i<vec.size();i++)
    {
        while(vec[i].second--)
        {
            result[index]=vec[i].first;
            index += 2;
            if(index>=S.size())
            index=1;
        }
    }
    return result;
    }
};

在这个题目里,我学到了一个新知识:
pair
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。

pair 默认对first升序,当first相同时对second升序;

其标准库类型–pair类型定义在#include 头文件中,定义如下:
类模板:template<class T1,class T2> struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:

  • pair将一对值(T1和T2)组合成一个值,
  • 这一对值可以具有不同的数据类型(T1和T2),
  • 两个值可以分别用pair的两个公有函数first和second访问。

pair的创建和初始化
pair包含两个数值,与容器一样,pair也是一种模板类型。但是又与之前介绍的容器不同;
在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同

pair对象的操作
访问两个元素操作可以通过first和sencond访问:

生成新的pair对象
还可以利用make_pair创建新的pair对象:

通过tie获取pair元素值
在某些清况函数会以pair对象作为返回值时,可以直接通过std::tie进行接收。

越努力,越幸运!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值