给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。
之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
提示:
1 <= S.length <= 20000
S 仅由小写英文字母组成。
class Solution {
public String removeDuplicates(String S) {
StringBuffer stack=new StringBuffer();
int len=S.length();
int top = -1; //top比 i 小一位
for(int i=0;i<len;i++){
char ch=S.charAt(i);
if(top>=0&&stack.charAt(top)==ch){ //当后一个数==前一个数得时候,删除操作
stack.deleteCharAt(top); // 删除之前加得char,并且位置倒退一位,与下一个数进行比较
top--;
}else{
stack.append(ch);
top++;
}
}
return stack.toString();
}
}
知识点
1、StringBuffer的delete方法与deleteCharAt的区别
delete方法与deleteCharAt两个方法都是用来删除StringBuffer字符串指定索引字符的方法,
delete(int a,int b)有两个参数,使用时删除索引从a开始(包含a)到b(不包含b)的所有字符;
deleteCharAt(int a)只有一个参数,使用时删除索引为a的字符
2、StringBuffer 和 StringBuilder
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。