最长快乐字符串——贪心(ps:我一点也不快乐)

题目描述:

贪心思路:

题目要求找到最长的快乐字符串,且快乐字符串中不含有三个连续相同的字母。为了找到最长的字符串,我们可以使用如下贪心策略:

  • 尽可能优先使用当前数量最多的字母,因为最后同一种字母剩余的越多,越容易出现字母连续相同的情况。如果构建完成最长的快乐字符串后还存在剩余未选择的字母,则剩余的字母一定为同一种字母且该字母的总数量最多。
  • 依次从当前数量最多的字母开始尝试,如果发现加入当前字母会导致出现三个连续相同字母,则跳过当前字母,直到我们找到可以添加的字母为止。实际上每次只会在数量最多和次多的字母中选择一个。
  • 如果尝试所有的字母都无法添加,则直接退出,此时构成的字符串即为最长的快乐字符串。

代码: 

string longestDiverseString(int a, int b, int c) {
	string ans;
	vector<pair<int, char>>arr = { {a,'a'},{b,'b'},{c,'c'} };
	while (true) {
		sort(arr.begin(), arr.end(), [](auto& p1, auto& p2) {
			return p1.first > p2.first;
			});
		bool tag = false;
		for (auto& p : arr) {
			int m = ans.size();
			if (p.first <= 0)break;
			if (m >= 2 && ans[m - 1] == p.second && ans[m - 2] == p.second)
				continue;
			ans.push_back(p.second);
			p.first--;
			tag = true;
			break;
		}
		if (!tag)
			break;
	}
	return ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值