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.
题解:
Have two points i and j.
j points to current index in s.
i points to end of result.
Array count is the number of adjacent duplicates.
first do arr[i] = arr[j].
Update count[i]. If arr[i] == arr[i - 1], then count[i] = count[i - 1] + 1.
When count[i] hits k, then set back i by k.
Time Complexity: O(n). n = s.length().
Space: O(n).
AC Java:
1 class Solution { 2 public String removeDuplicates(String s, int k) { 3 if(s == null || s.length() < k){ 4 return s; 5 } 6 7 int n = s.length(); 8 int [] count = new int[n]; 9 int i = 0; 10 char [] arr = s.toCharArray(); 11 for(int j = 0; j < n; j++, i++){ 12 arr[i] = arr[j]; 13 count[i] = i > 0 && arr[i] == arr[i - 1] ? count[i - 1] + 1 : 1; 14 if(count[i] == k){ 15 i -= k; 16 } 17 } 18 19 return new String(arr, 0, i); 20 } 21 }