• 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 }
  • 相关阅读:
    TextOut和DrawText
    VC中字符串定义
    #define new DEBUG_NEW
    洛谷【P2257】 YY的GCD
    Lizards and Basements 2 解题报告
    在windows服务中添加WCF
    从数据库中获得表的字段和描述信息
    sql格式化工具
    在XPSP3中添允许多个远程桌面的步骤
    无法连接到WCF的异常
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12324677.html
Copyright © 2020-2023  润新知