java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
解题思路 |
---|
- 用栈,时间复杂度和空间复杂度都是O(n). 每次拿到新字符时,先比较栈顶字符,检查是否相邻重复,如果是,不入栈新字符,并且栈顶字符出栈移除
- 双指针,时间复杂度O(n),空间复杂度O(1). fast指针遍历字符串的字符,slow指针,找到每一个相邻重复的字符,让fast指针的元素后移到slow的位置,覆盖相邻重复字符。
双指针法图解 |
---|
代码 |
---|
- 栈
class Solution {
public String removeDuplicates(String s) {
StringBuffer stack = new StringBuffer();//创建栈,用StringBuffer模拟栈
int top = -1;//top模拟栈顶指针,初始为-1
for (int i = 0; i < s.length(); ++i) {//遍历字符串
char ch = s.charAt(i);//获取当前遍历字符
if (top >= 0 && stack.charAt(top) == ch) {//如果栈中有元素,且栈顶元素,和当前字符相邻重复
stack.deleteCharAt(top);//就将字符去除
--top;//栈顶指针下移
} else {//栈中无元素,就将其添加到栈中
stack.append(ch);
++top;
}
}
return stack.toString();
}
}
- 双指针
class Solution {
public String removeDuplicates(String s) {
char[] ch = s.toCharArray();//获取字符数组
int fast = 0;//快指针,用于遍历字符数组
int slow = 0;//慢指针,用于寻找相邻重复的,应该去掉的元素位置
while(fast < s.length()){//快指针不要越界
ch[slow] = ch[fast];//让快指针指向的元素,移动到慢指针位置
if (slow > 0 && ch[slow] == ch[slow - 1]) {//如果slow位置和slow-1位置是相同元素,那就是需要去掉的元素
slow--;//slow回到需要去掉的位置
fast++;//fast继续遍历字符串
} else {//如果不是需要去掉的位置
slow++;//slow后移继续寻找应该去掉的位置
fast++;//fast继续遍历数组
}
}
return new String(ch,0,slow);
}
}