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

package leecode;

import java.util.Arrays;
import java.util.Stack;

/**
* @Author:Tang
* @CreateDate 2021/3/9
*
* 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
*
* 在 S 上反复执行重复项删除操作,直到无法继续删除。
*
* 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
*
* 1 <= S.length <= 20000
* S 仅由小写英文字母组成
*/
public class removeDuplicates {

/**
* 方法一
* 乍看一眼感觉得用递归 (做麻烦了)
*
* for循环 找到当前串中的一对重复数据为止
* 删除这一对 然后向下传递
* 直到再也没有重复的了
*/
public String execute(String S){
if(S == null || S.isEmpty()){
return "";
}
if(S.length() == 1){
return S;
}

int index = 0;

for (int i = index; i < S.length()-1; i++) {
if(S.charAt(i) == S.charAt(i+1)){
StringBuffer stringBuffer = new StringBuffer();
char[] array = S.toCharArray();
array[i] = 0;
array[i+1] = 0;
for (char c: array) {
if(c != 0){
stringBuffer.append(c);
}
}
return execute(stringBuffer.toString());
}

}
return S;

}

/**
* 方法二
* 两个重复项碰撞然后删除 很容易让人想到用栈
* @param S
* @return
*/
public String removeDuplicates(String S){
if(S.isEmpty()){
return S;
}

char[] charArr = S.toCharArray();
Stack<Character> stack = new Stack();

for (char c: charArr) {
if(!stack.isEmpty() && stack.peek() == c){
stack.pop();
}else {
stack.push(c);
}
}

StringBuffer stringBuffer = new StringBuffer();
for(int i = 0; i < stack.size(); i++){
stringBuffer.append(stack.get(i));
}
return stringBuffer.toString();
}

public static void main(String[] args) {
String result = new removeDuplicates().removeDuplicates("cabbc");
System.out.println(result);
}

}
原文地址:https://www.cnblogs.com/ttaall/p/14507800.html