重組字符串使得相邻的字母不相同,否则返回空字符串

思路:

1、若想重组后的字符串相邻字母不相同,则首先要计算字符串中出现次数最多的字母的个数,如果其值大于字符串长度的一半,则不能实现,返回空串,考虑字符串长度为奇数情况下,所以对字符串长度进行+1,再进行比较;

2、如果可以实现重组字符串,则应该用数组保存每个字母出现的次数以及是哪一个字母;

3、如果1,2步都已实现,则对数组中的字母进行一定规则的顺序插入,可以采取等步长的方式进行插入,这样可以保证相邻字母不相同,此外应将出现次数按照从小到大的顺序进行排序,因为可能会出现相邻的情况,比如“aab”,应将'b'插入位置1,然后将'a’插入0和1.

4、最后将字符数组转换成字符串,使得字符串相邻字母不相同

 

实现:

1、首先创建大小为26的整形数组,代表字母'a'到'z'出现的次数,为了既能保存字母出现次数又能保存字母的信息,每当出现一次,则使得对应值+100,最后分别再加上各自的索引值,形成数组中的值为a[i]=100*count+i,i代表数组的索引,也代表'a'+i字母,count表示该字母出现的次数;

2、将1所得到的的数组进行排序,并判断最大次数a[25]/100是否满足思路1的情况

3、创建新的字符数组,其长度为字符串长度,遍历上述a数组,计算每个字母出现的次数a[i]/100以及字母信息'a'+a[i]%100,然后在位置1开始插入,步长为2,当插入的位置大于新建数组长度时,开始从0插入;

4、将字符数组转化为字符串

代码:

import java.util.*;
class Solution {
    public String reorganizeString(String S) {
        int length=S.length();
        int[] counts=new int[26];
        for(char c: S.toCharArray()){
            counts[c-'a']+=100;
        }
        for(int i=0; i<26; i++){
            counts[i]+=i;
        }
        Arrays.sort(counts);
        if(counts[25]/100>(length+1)/2){
            return "";
        }
        
        char[] ans=new char[length];
        int t=1;
        for(int i=0; i<26; i++){
            int times=counts[i]/100;
            char c=(char)('a'+(counts[i]%100));
            for(int l=0; l<times; l++){
                if(t>=length){
                    t=0;
                }
                ans[t]=c;
                t+=2;
            }
        }
        return String.valueOf(ans);
    }
}

猜你喜欢

转载自www.cnblogs.com/lotz/p/10909473.html
今日推荐