力扣 OJ 767. 重构字符串

一曲冷凌霜 提交于 2020-02-09 18:08:44

题目:

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

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

示例 1:

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

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

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

 

 

思路:

分2步,

先判断最多的字符是否超过其他所有字符的数量+1,如果超过就无法重构,不超过就可以重构。

其次,按照贪心原则,每次取数量最多的字符即可。

代码:

class Solution {
public:
	string reorganizeString(string S) {
		int num[26] = { 0 };
		int len = S.length();
		for (int i = 0; i < len; i++)num[S[i] - 'a']++;
		for (int i = 0; i < 26; i++)if (num[i]>(len + 1) / 2)return "";
		string ans = S;
		char tmp = '0';
		for (int i = 0; i < len; i++)
		{
			int maxNum = 0, maxId = 0;
			for (int j = 0; j < 26; j++)
			{
				if (tmp - 'a' == j)continue;
				if (maxNum < num[j])maxNum = num[j], maxId = j;
			}			
			ans[i] = tmp = 'a' + maxId;
			num[maxId]--;
		}
		return ans;
	}
};

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!