链接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;
}