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 }
原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12324677.html