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()
        }
    }
  • 相关阅读:
    客户端命令行查看dubbo服务的生产者和消费者
    灰度发布
    灰度发布方法了解
    spring事务隔离级别
    小东西
    从excel表中生成批量SQL,将数据录入到数据库中
    CSV导出
    详解Java的自动装箱与拆箱(Autoboxing and unboxing)
    java多线程理解
    spring事务传播行为讲解转载
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13326825.html
Copyright © 2011-2022 走看看