首页 > 其他分享 >LeetCode.1047 删除字符串中的所有相邻重复项

LeetCode.1047 删除字符串中的所有相邻重复项

时间:2023-02-01 23:33:00浏览次数:36  
标签:deque slow String 相邻 res top 字符串 str LeetCode.1047

1.题目

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。


2.代码

方法一:用栈——stack

class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
//最后栈里面留下来的就是最后的结果
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
if(stack.empty() || c != stack.peek()){
stack.push(c);
}else{
stack.pop();
}
}
//进行字符串的拼接
String str = "";
while(!stack.empty()){
str = stack.pop() + str;//这里决定了拼接顺序
}
return str;

}
}


用栈——ArrayDeque

class Solution {
public String removeDuplicates(String S) {
//ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
//参考:https://stackoverflow.com/questions/6163166/why-is-arraydeque-better-than-linkedlist
ArrayDeque<Character> deque = new ArrayDeque<>();
char ch;
for (int i = 0; i < S.length(); i++) {
ch = S.charAt(i);
if (deque.isEmpty() || deque.peek() != ch) {
deque.push(ch);
} else {
deque.pop();
}
}
String str = "";
//剩余的元素即为不重复的元素
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
}



方法二:用字符串当做栈

class Solution {
public String removeDuplicates(String s) {
// 将 res 当做栈
// 也可以用 StringBuilder 来修改字符串,速度更快
// StringBuilder res = new StringBuilder();
StringBuffer res = new StringBuffer();
// top为 res 的长度
int top = -1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 当 top > 0,即栈中有字符时,当前字符如果和栈中字符相等,弹出栈顶字符,同时 top--
if (top >= 0 && res.charAt(top) == c) {
res.deleteCharAt(top);
top--;
// 否则,将该字符 入栈,同时top++
} else {
res.append(c);
top++;
}
}
return res.toString();
}
}


方法三:快慢指针

class Solution {
public String removeDuplicates(String s) {
//把字符串变成字符数组
char[] c = s.toCharArray();
//定义快慢指针
int fast = 0;
int slow = 0;
//注意这里不能相等,不然会超出数组长度
while(fast<s.length()){
c[slow] = c[fast];//直接用fast指针覆盖slow指针的值
if(slow>0 && c[slow]==c[slow-1]){//如果相邻两个值相同,那么slow指针后退一步,下一轮循环就可以被覆盖掉
slow--;
}else{//否则就slow向前移动
slow++;
}
//不管如何,快指针都会向前移动
fast++;

}
//最后返回字符串,可以直接把字符数组变成字符串,并且是有选择的变
return new String(c,0,slow);//最后0到slow就是答案!!!!!!!!!!!!

}
}

标签:deque,slow,String,相邻,res,top,字符串,str,LeetCode.1047
From: https://blog.51cto.com/u_15806469/6031965

相关文章