版权声明:本文为博主原创文章,转载时注明出处,附加链接即可。 https://blog.csdn.net/cswhit/article/details/81904059
题目链接:https://leetcode-cn.com/problems/reorganize-string/description/
给定一个字符串S
,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab"
输出: "aba"
示例 2:
输入: S = "aaab"
输出: ""
注意:
S
只包含小写字母并且长度在[1, 500]
区间内。
这个题,分析一下可以看出来,在一个元素个数为3另一个元素个数为1时,就是这样ABAA,显然无法使相邻的字符不同;在一个元素个数为5,一个元素个数为2,一个元素个数为1的情况为ABABACAA,显然也不行,由此可得规律,如果最多的元素个数>=其他元素个数的总和加2。
接下来就可以用哈希表来存储元素的个数,因为他说输入的元素为小写字母,所以下标范围也就是97到97+26了,然后遍历获取每个元素的个数,算出是否满足前面的公式,如果可以的话继续执行下面生成字符串的代码,生成字符串的方法有很多,我采用的是写一个数量最多的元素,然后再写一个与之前元素不同的数量最多的元素,这样循环生成。OK,上代码
class Solution {
public String reorganizeString(String S) {
//哈希
int[] arr = new int[130];
char[] str = S.toCharArray();
for(char i:str) {
arr[(int)i]++;
}
int max = 0,sum=0,maxn=0,maxc=0;
for(int i=97;i<=97+26;i++){
if(max<arr[i])
max=arr[i];
sum+=arr[i];
}
//公式判断
if((sum-max+2)<=max)
return "";
//生成字符串
StringBuffer strs = new StringBuffer();
while(sum>0) {
max=0;
for(int i=97;i<=97+26;i++){
if(max<arr[i]&&maxc != i) {
max = arr[i];
maxn = i;
}
}
strs.append((char)maxn);
maxc = maxn;
sum--;
arr[(int)maxc]--;
}
return String.valueOf(new String(strs));
}
}