767. 重构字符串

题目

(https://leetcode-cn.com/problems/reorganize-string/)
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

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

示例 1:

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

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

S 只包含小写字母并且长度在[1, 500]区间内。

分析

自己原来的思路是直接把字符串分组。
看了某一个大神的思路。感觉把字符串映射打数组的下标简单很多

要使相邻的不一样。只要满足出现频率最大的数<(.length/2+1)就好了
首先,将字符串映射到int[26]里面
int[] arr = new int[26];
遍历S, ++arr[c-'a'],就可以得到每个字符的数量

如何分配位置呢?
当然是交叉分配。定义两个下边。一个从0开始,一个从1开始分配

代码

class Solution {
    public String reorganizeString(String S) {
        int length = S.length();
        if(length == 1) return S;
        int[] arr = new int[26];
        int max_length = 0;
        for(char c : S.toCharArray()){
            if(max_length < ++arr[c-'a']) max_length = arr[c-'a'];
        }
        if(max_length > (length+1)/2) return "";
        char[] ret = new char[S.length()];
        int even = 0,odd = 1;
        for(int i=0;i<26;i++){
            while(arr[i]>0 && arr[i]<(length/2+1) && odd0){
                ret[even] = (char)(i + 'a');
                arr[i]--;
                even += 2;
            }
        }
        return new String(ret);
    }
}

结果

image.png

你可能感兴趣的:(767. 重构字符串)