
在刚看到本题的时候,不禁让我联想到小时候玩过的一款游戏----消消乐,其实这道题和“消消乐”也有些许相似之处,需要我们将新遍历到的字符与之前遍历过的字符进行匹配与消除,这和“有效的括号”这道题思路相似,具体解法如下:
我们在遍历整个字符串的时候把他的字符依次存入一个栈中,如果遍历到与栈顶相同的字符就不再存入,而是把栈顶弹出从而达到消除的效果,最后再将栈中的所有字符弹出组成字符串,因为栈是倒着将串取出的,所以我们还需要将这个字符串进行反转,具体代码如下:
class Solution {
public String removeDuplicates(String s) {
Stack<Character> sta = new Stack<>();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(sta.empty()) {
sta.push(ch);
} else if(sta.peek() != ch) {
sta.push(ch);
} else {
sta.pop();
}
}
Stack<Character> st = new Stack<>();
while(!sta.empty()){
st.push(sta.pop());
}
String str = "";
while(!st.empty()){
str += st.pop();
}
return str;
}
}
除此解法外,我们还可以使用双指针法,具体代码如下:
class Solution {
public String removeDuplicates(String s) {
char[] ch = s.toCharArray();
int fast = 0;
int slow = 0;
while(fast < s.length()){
// 直接用fast指针覆盖slow指针的值
ch[slow] = ch[fast];
// 遇到前后相同值的,就跳过,即slow指针后退一步,下次循环就可以直接被覆盖掉了
if(slow > 0 && ch[slow] == ch[slow - 1]){
slow--;
}else{
slow++;
}
fast++;
}
return new String(ch,0,slow);
}
}
文章介绍了如何使用栈数据结构和双指针法解决字符串中去除重复字符的问题。通过遍历字符串,将字符入栈,遇到重复字符时消除,最后反转栈内元素得到结果。此外,还提供了一种使用双指针直接更新字符数组的方法,避免了额外的数据结构。

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



