6-17 字符串消消乐

首先声明一点,我的解法复杂度为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]=' ';都无所谓,因为我的是模拟这个过程,可能更利于理解吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值