重构字符串
题目:
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab"
输出: "aba"
示例 2:
输入: S = "aaab"
输出: ""
解题思路:首先需要统计每个字符的出现次数,记录出现次数最多的字符,之后对出现次数最多的字符进行判断,它的出现次数是否大于了字符串长度的一半,如果大于则必然出现相邻的情况,如果没有大于那么就把出现次数最多的字符放在数组的偶数位上,其他字符依次填充进数组即可
class Solution {
public String reorganizeString(String S) {
if(S == null || S.isEmpty()) {
return S;
}
char ch[] = S.toCharArray();
int len = ch.length;
int count[] = new int[26];
//统计每个字符的出现次数
for(int i = 0; i < len; i++) {
count[ch[i] - 'a']++;
}
//找出出现次数最多的字符
int max = 1;
char maxChar = ch[0];
for(int i = 0; i < len; i++) {
char c = ch[i];
if(count[c - 'a'] > max) {
max = count[c - 'a'];
maxChar = c;
}
}
int threshold = (len + 1) / 2; //字符能出现的最大次数
if(max > threshold) {
return "";
}
//开始对字符进行填充
//首先填充最多出现次数的字符,将它放在数组的偶数位中
//必须放在数组偶数位中,如果放奇数位可能会发生无法全部放完的情况导致有相同字符相邻
//放完最多出现次数的字符后再依次填充其他字符
int cur = 0;
char ans[] = new char[len];
while(count[maxChar - 'a'] > 0) {
ans[cur] = maxChar;
cur += 2;
count[maxChar - 'a']--;
}
for(int i = 0; i < 26; i++) {
char c = (char)(i + 'a');
while(count[i] > 0) {
if(cur >= len) {
cur = 1;
}
ans[cur] = c;
cur += 2;
count[i]--;
}
}
return new String(ans);
}
}