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);
    }
}