今天的每日一题,我学到了一个新知识: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进行接收。
越努力,越幸运!