| java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/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);
}
}
本文介绍了使用Java实现的两种方法来解决字符串中相邻重复字符的删除问题:一种是利用栈的O(n)时间复杂度和O(1)空间复杂度,另一种是双指针法,通过快慢指针找到并替换重复字符。






233

被折叠的 条评论
为什么被折叠?



