【sf-3】删除相邻且相同的字符

题目:

给出一个字符串,找出相邻且相同的字符,并删除它们。

在该字符上反复执行上述操作,知道无法继续删除。

在完成所有重复项删除操作后返回最终字符串。

限制:

        1<=输入字符串长度<=2000

        输入字符串仅为小写字母组成

思路:

1.存储: 用一个字符数组存储输入的字符串。

2.判断相邻重复:编写辅助函数,利用索引i、i+1,判断是否重复,有的话就返回true

3.删除重复字符:编写辅助函数,因为要做删除操作,所以读取字符串个数一定大于等于写入字符串个数。可以利用两个索引,读写,同时对字符串进行遍历。

        最后一个字符串或者没有相邻重复字母:不需要删除,读位置 写道 写位置即可。

        多个字符相邻重复:while循环判断重复结束,只需要增加读索引即可。后面读到不重复的,读索引的字符写到 写索引的位置即可,覆盖掉重复的字符。

        最后写索引尾部加'\0',

代码:

//辅助函数:检查字符串相邻字母是否有相同的字符
bool repeate(const char *str)
{
    int len = strlen(str);
    for(int i=0; i<len-1; i++)
    {
        if( str[i] == str[i+1] )
        return true;
    }
    return false;
}

//主函数:用于删除相邻且相同的字母
void de(char *str)
{
    int len = strlen(str);
    int writeindex =0;
    for(int readindex=0; readindex<len; readindex++)
    {
        //最后一个字符 或者 没有重复的
        if(readindex==len-1 || str[readindex] != str[readindex+1])
            str[writeindex++] = str[readindex];
        else{   //多个重复的字符相邻
            while( str[readindex] == str[readindex+1] )
                readindex++;
        }
    }
    str[writeindex]='\0';
}

int main(){
    char str[100]={0};
    printf("input string:");
    scanf("%s",&str);
    while(repeate(str) )
    {
        de(str);
    }
    printf("finaly: %s", str);
    return 0;
}

运行结果:

一点点的思考:

思考1:一个数组 的 读、写索引。

需要修改数组时(增删改),都可以利用两个索引来进行操作,很方便。不需要再搞一个空的大小一样的数组来存放。

思考2:判断一件事的真假,决定要不要去操作。

判断一个事件的真假,用while循环去执行,知道这件事不需要操作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值