题目
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例 1:
输入: S = “aab” 输出: “aba” 示例 2:
输入: S = “aaab” 输出: “”
难呀难,学习呀生活呀人生啊~~~~
public class ReorganizeString {
public static void main(String[] args) {
ReorganizeString test = new ReorganizeString();
System.out.println(test.reorganizeString("aaab"));
System.out.println(test.reorganizeString("aab"));
System.out.println(test.reorganizeString("baaba"));
System.out.println(test.reorganizeString("eqmeyggvp"));
System.out.println(test.reorganizeString("abbabbaaab"));
System.out.println(test.reorganizeString("vvvlo"));
System.out.println(test.reorganizeString("bfrbs"));
System.out.println(test.reorganizeString("aaaaaabbbbbabababbba"));
}
public String reorganizeString(String S) {
// 特殊情况
if (S.length() == 1) {
return S;
}
if (S.length() == 2) {
return S.charAt(0) != S.charAt(1) ? S : "";
}
// 找出现次数最多的字符
int[] count = new int[26];
int max = 0;
char[] ch = S.toCharArray();
for (int i = 0; i < S.length(); i++) {
count[ch[i] - 'a']++;
if (count[ch[i] - 'a'] > max) {
max = count[ch[i] - 'a'];
}
//注意max 的取值,不要取成字符了
}
//如果最大个数超过剩余的两倍,绝对不可能重构起来的
if (max > 2 * (S.length() - max)) {
return "";
}
// 将出现的最多的字符先用一个list存储起来
List<Character> list = new ArrayList<>();
for (int i = 0; i < count.length; i++) {
if (count[i] == max) {
list.add((char) (i + 'a'));
}
}
//设置一个buffer,初始化为0
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < S.length(); i++) {
buffer.append(0);
}
//错位重构法:从0开始放,步长为2,将偶数下标的地方放出现次数最多的字符
//然后剩下来的位置,放次数较少的。
int start = 0;
int end = 0;
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < max; j++) {
if (end >= ch.length) {
end = ++start;
}
buffer.setCharAt(end, list.get(i));
end += 2;
}
//一定要置为0哦,后面会用到的
count[list.get(i) - 'a'] = 0;
}
//将出现最多的安置好了之后,遍历count,看还有谁没有加入buffer。
///同样的方法,从end位置开始
//end指向的位置,是刚好放完所有出现次数多的字符,接下来该放的位置
for (int i = 0; i < count.length; i++) {
if (count[i] > 0) {
for (int j = 0; j < count[i]; j++) {
if (end >= ch.length) {
end = ++start;
}
buffer.setCharAt(end, (char) (i + 'a'));
end += 2;
}
}
}
//所有再判断一下
for (int i = 1; i < buffer.length(); i++) {
if (buffer.charAt(i) == buffer.charAt(i - 1)) {
return "";
}
}
return buffer.toString();
}
}
反思
费脑子!!
功力不够!多练!
end.