题目
(https://leetcode-cn.com/problems/reorganize-string/)
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = "aab"
输出: "aba"
示例 2:
输入: S = "aaab"
输出: ""
注意:
S 只包含小写字母并且长度在[1, 500]区间内。
分析
自己原来的思路是直接把字符串分组。
看了某一个大神的思路。感觉把字符串映射打数组的下标简单很多
要使相邻的不一样。只要满足出现频率最大的数<(.length/2+1)就好了
首先,将字符串映射到int[26]里面
int[] arr = new int[26];
遍历S, ++arr[c-'a'],就可以得到每个字符的数量
如何分配位置呢?
当然是交叉分配。定义两个下边。一个从0开始,一个从1开始分配
代码
class Solution {
public String reorganizeString(String S) {
int length = S.length();
if(length == 1) return S;
int[] arr = new int[26];
int max_length = 0;
for(char c : S.toCharArray()){
if(max_length < ++arr[c-'a']) max_length = arr[c-'a'];
}
if(max_length > (length+1)/2) return "";
char[] ret = new char[S.length()];
int even = 0,odd = 1;
for(int i=0;i<26;i++){
while(arr[i]>0 && arr[i]<(length/2+1) && odd<length){
ret[odd] = (char)(i + 'a');
arr[i]--;
odd += 2;
}
while(arr[i]>0){
ret[even] = (char)(i + 'a');
arr[i]--;
even += 2;
}
}
return new String(ret);
}
}
结果
image.png