Java:
方法一:
利用栈来消除相邻重复项:
注意:char类型不能判断是否和null相等;
class Solution {
public String removeDuplicates(String s) {
ArrayDeque<Character> deque = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
// char类型不能判断是否为null
// if (s.charAt(i) == deque.peek()) {
// deque.pop();
// } else {
// deque.push(s.charAt(i));
// }
if (!deque.isEmpty() && s.charAt(i) == deque.peek()) {
deque.pop();
} else {
deque.push(s.charAt(i));
}
}
String ans = "";
int size = deque.size();
for (int i = 0; i < size; i++) {
ans = deque.pop() + ans;
}
// deque随着pop,size会变化
// for (int i = 0; i < deque.size(); i++) {
// ans = deque.pop() + ans;
// }
// while (!deque.isEmpty()) {
// ans = deque.pop() + ans;
// }
return ans;
}
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
方法二:
双指针:
// 双指针
class Solution {
public String removeDuplicates(String s) {
char[] c = s.toCharArray();
int slow = 0;
int fast = 0;
while (fast < s.length()) {
c[slow] = c[fast];
if (slow == 0 || c[slow] != c[slow - 1]) {
slow++;
} else {
slow--;
}
fast++;
// c[slow] = c[fast];
}
return new String(c, 0, slow);
}
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)