day28 力扣1047 删除字符串中的所有相邻重复项

链接1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

题目

 

 思路1:

参考day27有效的括号,使用栈实现,当遍历到的元素与栈顶元素(栈顶指针前一位)相同时,栈顶指针前移一位(相当于弹出元素),用循环继续判断

需要解决的问题1:首元素的处理

方法:当栈顶指针不大于0时,不进行判断

需要解决的问题2:使用栈实现如何输出正向字符串

方法:输出整个栈,把栈当成字符串,当需要添加字符串结束语句

需要解决的问题三:用while循环还是for循环

方法:栈实现的话都可以

代码1:

char * removeDuplicates(char * s){
    int slen=strlen(s);
    //注意需要申请的空间为字符串长度+1,为了存放'\0'
    char *stack=malloc(sizeof(char)* slen+1);
    int stacktop=0;

    

    for(int i=0;i<slen;i++)
    { 
        char tempchar=s[i];
        if(stacktop>0&&tempchar==stack[stacktop-1])
        {
            stacktop--;
        }
        else stack[stacktop++]=s[i] ;
    }
    //**
    stack[stacktop]='\0';
    return stack;
}

思路2

用双指针法实现,在原字符串上直接修改,fast指针用于遍历,slow指针用于记录无重复元素,做法与栈相似,需要注意的是输出时字符串结束的语句有些许不同 

代码2

char * removeDuplicates(char * s)
{
    int slen=strlen(s);
    int fast=0,slow=0;

    //fast用于遍历字符串,slow用于记录元素
    while(fast<slen)
    {
        char tempchar=s[slow]=s[fast++];
        if(slow>0&&s[slow-1]==tempchar)slow--;
        else slow++;
    }
    //注意此时不需要+1,slow指向的即为空
    s[slow]='\0';
    return s;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值