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

    原题链接在这里:https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/

    题目:

    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.

    题解:

    Follow the instruction, delete the duplicate, when we have a delete, mark changed as true.

    While changed is true, continue.

    Time Complexity: O(n^2/k - n). n = s.length(). each level, s becomes n - k, totally there are n/k level.

    Space: O(n).

    AC Java:

     1 class Solution {
     2     public String removeDuplicates(String s, int k) {
     3         if(s == null || s.length() == 0){
     4             return s;
     5         }
     6         
     7         if(k == 1){
     8             return "";
     9         }
    10         
    11         boolean changed = true;
    12         while(changed){
    13             changed = false;
    14             StringBuilder sb = new StringBuilder();
    15             
    16             int i = 0;
    17             while(i < s.length()){
    18                 if(i == s.length() - 1 || s.charAt(i) != s.charAt(i + 1)){
    19                     sb.append(s.charAt(i));
    20                     i++;
    21                 }else{
    22                     int j = i + 1;
    23                     int count = 1;
    24                     while(j < s.length() && s.charAt(j) == s.charAt(i) && count < k){
    25                         j++;
    26                         count++;
    27                     }
    28                     
    29                     if(count < k){
    30                         sb.append(s.substring(i, j));   
    31                     }else{
    32                         changed = true;
    33                     }
    34                     
    35                     i = j;
    36                 }
    37             }
    38             
    39             s = sb.toString();
    40         }
    41         
    42         return s;
    43     }
    44 }
  • 相关阅读:
    python两个dict相加
    rpm命令
    python logging模块不支持多进程写到一个log文件
    技术论坛地址收集
    visudo命令编辑修改/etc/sudoers配置文件
    健康是什么
    .net文件类型种种
    禁止脚本的运行
    静态页面的值传递
    datagrid数据导出到excel文件给客户端下载的几种方法 (转)
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12324677.html
Copyright © 2011-2022 走看看