重构字符串

重构字符串

题目:
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例 1:

输入: S = "aab"
输出: "aba"
示例 2:

输入: S = "aaab"
输出: ""

解题思路:首先需要统计每个字符的出现次数,记录出现次数最多的字符,之后对出现次数最多的字符进行判断,它的出现次数是否大于了字符串长度的一半,如果大于则必然出现相邻的情况,如果没有大于那么就把出现次数最多的字符放在数组的偶数位上,其他字符依次填充进数组即可

class Solution {
    public String reorganizeString(String S) {
        if(S == null || S.isEmpty()) {
            return S;
        }
        
        char ch[] = S.toCharArray();
        int len = ch.length;
        int count[] = new int[26];
        
        //统计每个字符的出现次数
        for(int i = 0; i < len; i++) {
            count[ch[i] - 'a']++;
        }
        
        //找出出现次数最多的字符
        int max = 1;
        char maxChar = ch[0];
        
        for(int i = 0; i < len; i++) {
            char c = ch[i];
            if(count[c - 'a'] > max) {
                max = count[c - 'a'];
                maxChar = c;
            }
        }
        
        
        int threshold = (len + 1) / 2;  //字符能出现的最大次数
        
        if(max > threshold) {
            return "";
        }
        
        //开始对字符进行填充
        //首先填充最多出现次数的字符,将它放在数组的偶数位中
        //必须放在数组偶数位中,如果放奇数位可能会发生无法全部放完的情况导致有相同字符相邻
        //放完最多出现次数的字符后再依次填充其他字符
        int cur = 0;
        char ans[] = new char[len];
        
        while(count[maxChar - 'a'] > 0) {
            ans[cur] = maxChar;
            cur += 2;
            count[maxChar - 'a']--;
        }
        
        for(int i = 0; i < 26; i++) {
            char c = (char)(i + 'a');
            while(count[i] > 0) {
                if(cur >= len) {
                    cur = 1;
                }
                
                ans[cur] = c;
                cur += 2;
                count[i]--;
            }
        }
        
        return new String(ans);
    }
}
原文地址:https://www.cnblogs.com/katoMegumi/p/14060756.html