[LeetCode1日1つの質問] [中] 767。リファクタリング文字列

[LeetCode1日1つの質問] [中] 767。リファクタリング文字列

767.文字列のリファクタリング

767.文字列のリファクタリング

アルゴリズムのアイデア:文字列

トピック:

ここに画像の説明を挿入します

問題解決の
アイデア:

  1. まず、繰り返し回数が最も多い文字を偶数の位置(0、2、4 、、、)に置きます。書き込めない場合は、文字を並べて繰り返す必要があります。可能であれば、必要です。そのような文字列である;
  2. 次に、残りの文字を残りの偶数の位置(存在する場合)に配置し、次に奇数の位置(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);
    }
}

おすすめ

転載: blog.csdn.net/qq_39457586/article/details/110391010