题目:给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = “aab”
输出: “aba”
示例 2:
输入: S = “aaab”
输出: “”
注意:
S 只包含小写字母并且长度在[1, 500]区间内。
相关话题:堆,贪心算法,排序,字符串;
我的思路:一开始就想到最多的字符肯定是不能超过字符串( length+1)/2的,这样
一定存在一个方案可以使得字符串S的每一个字母不相邻。
所以,我们使用一个数组count来存储S中每一个字母的出现的次数
这样就能把最多的字符隔一个插一个,就是说插一个索引加2。然后再将其余的字符串按照之前的规律插入进去。
下面是我leetcode提交的代码;
class Solution {
public String reorganizeString(String S) {
int[] count = new int[26];
String s = "";
int len = S.length();
int maxNum = 0;
int index = 0;
int j;
char[] res = new char[len];
for(int i= 0; i< len;i++){
j = (int)(S.charAt(i) - 'a');
count[j]++;
if(count[j]>maxNum){
maxNum = count[j];
index = j;
}
}
int n = 0;
if(maxNum <= (len+1)/2){
for(int k = 0;k<count[index];k++){
res[n] = (char)(index + 'a');
n +=2;
}
count[index] = 0;
for(int i = 0 ; i < 26; i++) {
int c = count[i];
while(c > 0 ) {
if(n >= len ) n = 1;
res[n] = (char)(i + 'a');
n += 2;
c --;
}
}
s = new String(res);
return s;
}else{
return s;
}
}
}