给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
| 12
 3
 4
 
 | 输入:"abbaca"输出:"ca"
 解释:
 例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
 
 | 
提示:
- 1 <= S.length <= 20000
- S仅由小写英文字母组成。
代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | class Solution {public String removeDuplicates(String s) {
 char[] charArr = s.toCharArray();
 Stack<Character> st = new Stack();
 for(int i = 0; i < charArr.length; i++){
 if(st.isEmpty() || charArr[i] != st.peek()){
 st.push(charArr[i]);
 }else if(st.peek() == charArr[i]){
 st.pop();
 }
 }
 int k = st.size()-1;
 char[] ans = new char[k+1];
 
 while(!st.isEmpty()){
 ans[k--] = st.pop();
 }
 return new String(ans);
 }
 }
 
 | 
直接拿字符串作为栈
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | class Solution {public String removeDuplicates(String s) {
 StringBuilder sb = new StringBuilder();
 char[] charArr = s.toCharArray();
 
 for(int i = 0; i < charArr.length; i++){
 if(sb.length() == 0 || charArr[i] != sb.charAt(sb.length()-1)){
 sb.append(charArr[i]);
 }else if(sb.charAt(sb.length() - 1) == charArr[i]){
 sb.deleteCharAt(sb.length() - 1);
 }
 }
 
 return sb.toString();
 }
 }
 
 |