题目:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
分析:
当字符串中同时有多组相邻重复项时,无论是先删除哪一个,都不会影响最终的结果。因此我们可以从左向右顺次处理该字符串。而消除一对相邻重复项可能会导致新的相邻重复项出现,如从字符串 abba中删除 bb 会导致出现新的相邻重复项 aa 出现。因此我们需要保存当前还未被删除的字符。一种显而易见的数据结构呼之欲出:栈。我们只需要遍历该字符串,如果当前字符和栈顶字符相同,我们就贪心地将其消去,否则就将其入栈即可。
代码:
class Solution {
public String removeDuplicates(String S) {
char[] s = S.toCharArray();
int top = -1;
for(int i = 0; i < s.length; i++) {
if (top == -1 || s[top] != s[i]) {
s[++top] = s[i];
} else {
top --;
}
}
return String.valueOf(s, 0, top+1);
}
}
复杂度:
时间复杂度:O(n),其中 n 是字符串的长度。我们只需要遍历该字符串一次。
空间复杂度:O(n)或 O(1),取决于使用的语言提供的字符串类是否提供了类似「入栈」和「出栈」的接口。注意返回值不计入空间复杂度。