这道题难度其实说难也不算难,说简单也不见得是简单的,究其原因就是理解题的本意最重要,我也是错了好几次最终才把结果写对了。
给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。
返回 s 的任意可能的重新排列。若不可行,返回空字符串 "" 。
示例 1:
输入: s = "aab"
输出: "aba"
示例 2:
输入: s = "aaab"
输出: ""
提示:
1 <= s.length <= 500
s 只包含小写字母
char * reorganizeString(char * s){
int max=-1,hash[30],length=strlen(s),i,j,pop=0,k=0;
memset(hash,0,sizeof(hash));
for(i=0;i<length;i++)
{
hash[s[i]-'a']++;
max=fmax(max,hash[s[i]-'a']);
s[i]='0';
}
int num;
if(length%2==1){
num=1;
}else{
num=2;
}
for(i=0;i<30;i++)
{
if(hash[i]!=0)
{
pop++;
}
}
if(max>(length+1)/2)
{
return "";
}
max=0;
int flag=0;
j=0;
while(pop!=0)
{
for(i=0;i<30;i++)
{
if(max<hash[i])
{
max=hash[i];
flag=i;
}
}
if(max!=0)
{
pop--;
}else{
break;
}
max=0;
while(hash[flag]>0)
{
if(s[j]=='0')
{
s[j]=flag+'a';
hash[flag]--;
j+=2;
}
if(j>length-num&&k==0)
{
k=1;
j=1;
}
}
}
return s;
}
时间复杂度和空间复杂度都几乎完美,只是代码看起来比较冗余,但其实里面没有一个代码是没用的,仔细看一下就能懂我的思路。