标签:str 表数 div 相同 col 大于 rar 奇数 return
思路:
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); } }
标签:str 表数 div 相同 col 大于 rar 奇数 return
原文地址:https://www.cnblogs.com/lotz/p/10909473.html