zoukankan      html  css  js  c++  java
  • 1047. Remove All Adjacent Duplicates In String

    Given a string S of lowercase letters, a duplicate removal consists of choosing two adjacent and equal letters, and removing them.

    We repeatedly make duplicate removals on S until we no longer can.

    Return the final string after all such duplicate removals have been made.  It is guaranteed the answer is unique.

    Example 1:

    Input: "abbaca"
    Output: "ca"
    Explanation: 
    For example, in "abbaca" we could remove "bb" since the letters are adjacent and equal, and this is the only possible move.  The result of this move is that the string is "aaca", of which only "aa" is possible, so the final string is "ca".
    

    Note:

    1. 1 <= S.length <= 20000
    2. S consists only of English lowercase letters.

    用stack和一个pointer (fast),fast从index=0开始移动:

    如果S[f] = stack.top(),fast右移并弹出栈顶元素;如果S[f] != stack.top(),S[f]入栈并fast右移

    time: O(n), space: O(n)

    class Solution {
        public String removeDuplicates(String S) {
            if(S.length() <= 1) {
                return S;
            }
            char[] chs = S.toCharArray();
            Deque<Character> stack = new ArrayDeque<>();
            int f = 0;  // fast pointer
            while(f < chs.length) {
                if(!stack.isEmpty() && chs[f] == stack.peekFirst()) {
                    f++;
                    stack.pollFirst();
                } else {
                    stack.offerFirst(chs[f]);
                    f++;
                }
            }
            int len = stack.size();
            for(int i = len - 1; i >= 0; i--) {
                chs[i] = stack.pollFirst();
            }
            return new String(chs, 0, len);
        }
    }

    optimized, 用two pointers表示stack

    time: O(n), space: O(1)

    class Solution {
        public String removeDuplicates(String S) {
            if(S.length() <= 1) {
                return S;
            }
            char[] chs = S.toCharArray();
            int s = -1, f = 0;      // s, f - slow pointer, fast pointer
            while(f < chs.length) {
                if(s > -1 && chs[f] == chs[s]) {
                    f++;
                    s--;
                } else {
                    chs[++s] = chs[f];
                    f++;
                }
            }
            return new String(chs, 0, s + 1);
        }
    }
  • 相关阅读:
    [数据库]Mysql蠕虫复制增加数据
    [YII2.0] 高级模板简单安装教程
    PHP 将字符串转换为字符集格式UTF8/GB2312/GBK 函数iconv()
    [腾讯云]简单在腾讯云 CenTOS7.0 安装Nginx,Mysql(MariaDB),Memcache,解析PHP!
    cojs 简单的01串 题解报告
    5.13 考试修改和总结
    cojs 简单的最近公共祖先 解题报告
    5.11 考试 修改+总结
    My_Plan part1 小结
    cojs 简单的数位DP 题解报告
  • 原文地址:https://www.cnblogs.com/fatttcat/p/11334972.html
Copyright © 2011-2022 走看看