zoukankan      html  css  js  c++  java
  • 1209. Remove All Adjacent Duplicates in String II

    package LeetCode_1209
    
    import java.util.*
    
    /**
     * 1209. Remove All Adjacent Duplicates in String II
     * https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/description/
     *
     * Given a string s, a k duplicate removal consists of choosing k adjacent and equal letters from s and removing them causing the left and the right side of the deleted substring to concatenate together.
    We repeatedly make k duplicate removals on s until we no longer can.
    Return the final string after all such duplicate removals have been made.
    It is guaranteed that the answer is unique.
    
    Example 1:
    Input: s = "abcd", k = 2
    Output: "abcd"
    Explanation: There's nothing to delete.
    
    Example 2:
    Input: s = "deeedbbcccbdaa", k = 3
    Output: "aa"
    Explanation:
    First delete "eee" and "ccc", get "ddbbbdaa"
    Then delete "bbb", get "dddaa"
    Finally delete "ddd", get "aa"
    
    Example 3:
    Input: s = "pbbcggttciiippooaais", k = 2
    Output: "ps"
    
    Constraints:
    1 <= s.length <= 10^5
    2 <= k <= 10^4
    s only contains lower case English letters.
     * */
    
    data class Node(var char: Char, var count: Int = 1)
    
    class Solution {
        /*
        * solution:Queue, Time complexity:O(n), Space complexity:O(n)
        * */
        fun removeDuplicates(s: String, k: Int): String {
            val result = StringBuilder()
            var removed = false
            val queue = LinkedList<Node>()
            for (c in s) {
                //keep tracking the element at the tail
                if (queue.isEmpty() || queue.last.char != c) {
                    queue.addLast(Node(c))
                } else {
                    queue.last.count++
                    if (queue.last.count == k) {
                        queue.removeLast()
                        removed = true
                    }
                }
            }
            if (!removed) {
                return s
            }
            while (queue.isNotEmpty()) {
                val cur = queue.removeFirst()
                while (cur.count-- > 0) {
                    result.append(cur.char)
                }
            }
            return result.toString()
        }
    }
  • 相关阅读:
    【转】微信小程序原理
    【转】onAttachedToWindow()在整个Activity生命周期的位置及使用
    中序遍历非递归遍历算法
    多项式加法运算
    中缀表达式转换为后缀表达式
    多项式计算
    最大子列和问题
    广度优先搜索
    广搜和深搜的区别
    cookie 与 session 的区别详解
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13326825.html
Copyright © 2011-2022 走看看