• 重构字符串


    重构字符串

    题目:
    给定一个字符串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);
        }
    }
    
  • 相关阅读:
    framework7 底部弹层popup js关闭方法
    div动画旋转效果
    面试题3
    面试题2
    CORS跨域请求[简单请求与复杂请求]
    面试题1
    nginx
    Pycharm配置支持vue语法
    Ajax在jQuery中的应用---加载异步数据
    jQuery开发入门
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14060756.html
Copyright © 2020-2023  润新知