[LeetCode1日1つの質問] [中] 767。リファクタリング文字列
767.文字列のリファクタリング
アルゴリズムのアイデア:文字列
トピック:
問題解決の
アイデア:
- まず、繰り返し回数が最も多い文字を偶数の位置(0、2、4 、、、)に置きます。書き込めない場合は、文字を並べて繰り返す必要があります。可能であれば、必要です。そのような文字列である;
- 次に、残りの文字を残りの偶数の位置(存在する場合)に配置し、次に奇数の位置(1,3,5,7 ,,,,)を配置します。これにより、配置される各文字が前のもの、個別(隣接していない要件を満たす)
Javaコード
class Solution {
public String reorganizeString(String S) {
int[] m = new int[26];
int max = 0;//字重复最大频率
int alpha = 0;//最大重复字母下标
int maxEdge = (S.length() + 1) / 2;//字母重复最大频率上限
for (char ch : S.toCharArray()) {
int i = ch-'a';
m[i]++;//统计次数
if (m[i] > max) {
max = m[i];
alpha = i;
if (max > maxEdge) {
//如果最大的不能放下,则不可能存在这样的字符串
return "";
}
}
}
int n = S.length();
char[] res = new char[n];
int index = 0;
while (m[alpha] > 0) {
//将最大的重复字母放入偶数格子
res[index] = (char)(alpha + 'a');
m[alpha]--;
index += 2;//放入偶数格子
}
//把剩下的字符存储在其他位置上(先放剩下偶数格子,然后放奇数格子)
for (int i = 0; i < 26; i++) {
while (m[i] > 0) {
if (index >= n) {
index = 1;//如果越界后,表示偶数格子已经放完了,从奇数格子开始存放
}
res[index] = (char) (i + 'a');
m[i]--;
index += 2;
}
}
return new String(res);
}
}