题目:
题解一:
循环遍历字符串中的字符,遍历过程中判断当前字符与栈顶字符是否一致,如果一致弹出栈顶元素,如果不一致将当前字符压入栈中,最后将栈中的字符转化为字符串(注意:栈中的字符顺序与实际顺序相反)时间复杂度:O(n)
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char currentChar = s.charAt(i);
if (stack.isEmpty()) {
stack.push(currentChar);
continue;
}
Character peekChar = stack.peek();
if (currentChar != peekChar) {
stack.push(currentChar);
continue;
}
stack.pop();
}
StringBuilder stringBuilder = new StringBuilder();
while (!stack.isEmpty()) {
stringBuilder.append(stack.pop());
}
stringBuilder.reverse();
return stringBuilder.toString();
}
题解二:
数组替换法,类似于双指针,一个指向前一个元素,一个指向后一个元素,如果两个字符不相等,更新数组元素,时间复杂度:O(n)
public String removeDuplicates2(String s) {
char[] chars = s.toCharArray();
int top = -1;
for (int i = 0; i < s.length(); i++) {
if (top == -1 || chars[top] != chars[i]) {
chars[++top] = chars[i];
} else {
top--;
}
}
return new String(chars, 0, top+1);
}