项目场景:
提示:这里简述项目相关背景:
栈练习题
问题描述:
提示:这里描述项目中遇到的问题:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串
原因分析:
提示:这里填写问题的分析:
当字符串中同时有多组相邻重复项时,无论是先删除哪一个,都不会影响最终的结果,因此可以从左向右顺次处理该字符串
而消除一对相邻重复项可能会导致新的相邻重复项出现,如从字符串 abba 中删除bb 会导致出现新的相邻重复项aa 出现,因此需要保存当前还未被删除的字符。一种显而易见的数据结构呼之欲出:栈,只需要遍历该字符串,如果当前字符和栈顶字符相同,就贪心地将其消去,否则就将其入栈即可
解决方案:
提示:这里填写该问题的具体解决方案:
char * removeDuplicates(char * s)
{
int len=strlen(s);
int top=0;
char* stack=(char*)malloc((len+1)*sizeof(char));
for(int i=0;i<len;i++)
{
if(top>0 &&stack[top-1]==s[i])//保证栈不会下溢
{
top--;
}
else
{
stack[top++]=s[i];
}
}
stack[top]='\0';
return stack;
}