Given a string S, check if the letters can be rearranged so that two characters that are adjacent to each other are not the same.
If possible, output any possible result. If not possible, return the empty string.
Example 1:
Input: S = "aab"
Output: "aba"
Example 2:
Input: S = "aaab"
Output: ""
Note:
S will consist of lowercase letters and have length in range [1, 500]
代码
Approach 1: Sort by Count
Complexity Analysis
1 3 5 7 9...
0 2 4 6 8...
Time Complexity: O(A(_N+logA)), where N is the length of _S, and A is the size of the alphabet. In Java, our implementation is O_(_N+AlogA). If A is fixed, this complexity is O(N).
Space Complexity: O(N). In Java, our implementation is O_(_N+A).
classSolution {publicStringreorganizeString(String S) {int N =S.length();int[] counts =newint[26];for (char c :S.toCharArray()) { counts[c -'a'] +=100; }for (int i =0; i <26; i++) { counts[i] += i; }Arrays.sort(counts);char[] ans =newchar[N];int t =1;for (int code : counts) {int ct = code /100;char ch = (char) ('a'+ (code %100));if (ct > (N +1) /2) return"";for (int i =0; i < ct; i++) {if (t >= N) t =0; ans[t] = ch; t +=2; } }returnString.valueOf(ans); }}
Approach #2 Greedy with Heap
Complexity Analysis
Time Complexity: O(_N_logA)), where N is the length of S, and A is the size of the alphabet. If A is fixed, this complexity is O(N).
Space Complexity: O(A). If A is fixed, this complexity is O(1).
classSolution {publicStringreorganizeString(String S) {int N =S.length();int[] count =newint[26];for (char c :S.toCharArray()) { count[c -'a']++; } PriorityQueue<MultiChar> pq = new PriorityQueue<MultiChar((a, b) -> a.count == b.count ? a.letter - b.letter : b.count - a.count);
for (int i =0; i <26; i++) {if (count[i] > (N +1) /2) return"";pq.add(newMultiChar(count[i], (char) ('a'+ i))); }StringBuilder ans =newStringBuilder();while (pq.size() >=2) {MultiChar mc1 =pq.poll();MultiChar mc2 =pq.poll();ans.append(mc1.letter);ans.append(mc2.letter);if (--mc1.count>0) pq.add(mc1);if (--mc2.count>0) pq.add(mc2); }if (pq.size() >0) ans.append(pq.poll().letter);returnans.toString(); }}classMultiChar {int countPchar letter;MultiChar(int ct,char ch) { count = ct; letter = ch; }}