首先声明一点,我的解法复杂度为n^2级别,思路是消去两个字符后,立刻把之后的字符向前移动两次,如果i==0,i--否则i-=2,意义是回溯一格,如果本位是第一位,则相当于不回溯
可以看到消去过程的代码如下:
void fun (char *S){
//只遍历一遍,如果当前和后面一个字符相同,则
//从i开始,其后面的字符全部左移两格,且i-=2
int len=strlen(S);//遍历从0到倒数第二个字符
for(int i=0;i<len-1;i++){
if(S[i]==S[i+1]){
S[i]=S[i+1]=' ';
for(int j=0;j<2;j++){
printf("len:%d j:%d\n",len,j);
printf("%d->%d\n",i,len-j);
for(int k=i;k<len-j;k++){
printf("S[%d]=S[%d]\n",k,k+1);
S[k]=S[k+1];
}
puts(S);
}
if(i!=0)i-=2;
else i--;
len-=2;
}
}
}
以下是删除注释和多余的打印代码:
void fun (char *S){
int len=strlen(S);
for(int i=0;i<len-1;i++){
if(S[i]==S[i+1]){
S[i]=S[i+1]=' ';
for(int j=0;j<2;j++){
for(int k=i;k<len-j;k++){
S[k]=S[k+1];
}
puts(S);
}
if(i!=0)i-=2;
else i--;
len-=2;
}
}
}
本人觉得这题可能有点难在于要执行到第几位字符,有点难掌控吧。
我的解法有点偏向于模拟这个过程,还是比较笨,望不吝赐教
提交到PTA上
补充:其实加不加S[i]=S[i+1]=' ';都无所谓,因为我的是模拟这个过程,可能更利于理解吧