删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S
上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示
1 <= S.length <= 20000
S
仅由小写英文字母组成。
解题思路
针对第 N(N > 1) 个字符的处理方式:
- 如果 S[N] == S[N+1]
- S[N] 和 S[N+1] 为重复项,需要清除
- 判断 S[N+2] 是否等于 S[N-1] ,如果相等,重复项继续清除;如果不相等,则从第 N+2 个字符串,继续尽心判断
- 如果 S[N] != S[N+1]
- 从第 N+1个字符继续尽心判断
需要做好 N+2 和 N-1 是否越界的判断
题解 JAVA 实现
public String removeDuplicates(String S) {
if (S.length() <= 0) {
return "";
}
Deque deque = new ArrayDeque<>();
char[] charArray = S.toCharArray();
deque.addLast(charArray[0]);
for (int i = 1; i < charArray.length; i++) {
if (!deque.isEmpty() && deque.peekLast().equals(charArray[i])) {
deque.pollLast();
continue;
} else {
deque.addLast(charArray[i]);
}
}
StringBuilder result = new StringBuilder();
while (!deque.isEmpty()) {
result.append(deque.pollFirst());
}
return result.toString();
}