1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
提示:
1 <= S.length <= 20000
S 仅由小写英文字母组成。
思路
栈
malloc一个栈,来存放结果
遍历字符串s,如果元素和栈顶元素相同就删除栈顶元素,并且遍历下一个s中的元素,
需注意的是,top–的时候要判断top必须大于0否则不能减了,应该入栈了
代码
栈
char * removeDuplicates(char * s){
int len = strlen(s), top = 0;
char* stack = (char*)malloc(sizeof(char) * len + 1);
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;
}
双指针
char * removeDuplicates(char * s){
int sLen = strlen(s);
int fast = 0, slow = 0;
while (fast < sLen) {
s[slow] = s[fast++];
if (slow > 0 && s[slow] == s[slow - 1]) slow--;
else slow++;
}
s[slow] = '\0';
return s;
}