problem
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
solution
方法一
思路过程
- 就用循环,用一个标志位表明遍历所有S,是否存在邻近的相同的字母
- 存在,就替换掉(用字符串替换函数,可能把没有找到的相同的也替换掉,不过没关系)
- 不存在,结束,返回
- 另外一个结束就是空字符串
代码
class Solution {
public String removeDuplicates(String S) {
boolean exist=true;
if(S.length()==1){
return S;
}
while(!"".equals(S) && exist){
boolean temp=true;
for(int i=0;i<S.length()-1;i++){
if(S.charAt(i) == S.charAt(i+1)){
String reg=String.valueOf(S.charAt(i))+String.valueOf(S.charAt(i));
S=S.replaceAll(reg,"");
temp=false;
break;
}
}
if(temp){
exist=false;
}
}
return S;
}
}
方法二
思路
- 看了解答,用栈的方式真的是太机智了,一定要写一遍
- 栈的先进后出的特性
- 遍历字符串,如果当前字符于栈顶的字符相等,直接pop
- 否则push
- 记得考虑栈为空的情况
class Solution {
public String removeDuplicates(String S) {
// 用栈
int len=S.length();
if(len ==1 ){
return S;
}
Stack<Character> stack=new Stack<>();
char [] chars = S.toCharArray();
int i=0;
while(i<len){
// 如果遇到空栈
if(stack.isEmpty() ){
stack.push(chars[i]);
++i;
continue;
}
if(chars[i] == stack.peek()){
stack.pop();
}else{
stack.push(chars[i]);
}
++i;
}
StringBuffer res=new StringBuffer();
stack.stream().forEach(character -> {
res.append(character);
});
return res.toString();
}
}