leet-code/src/main/java/leetcode/editor/cn/RemoveAllAdjacentDuplicatesInStringIi.java

104 lines
3.1 KiB
Java
Raw Normal View History

//给你一个字符串 s「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。
//
// 你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。
//
// 在执行完所有删除操作后,返回最终得到的字符串。
//
// 本题答案保证唯一。
//
//
//
// 示例 1
//
// 输入s = "abcd", k = 2
//输出:"abcd"
//解释:没有要删除的内容。
//
// 示例 2
//
// 输入s = "deeedbbcccbdaa", k = 3
//输出:"aa"
//解释:
//先删除 "eee" 和 "ccc",得到 "ddbbbdaa"
//再删除 "bbb",得到 "dddaa"
//最后删除 "ddd",得到 "aa"
//
// 示例 3
//
// 输入s = "pbbcggttciiippooaais", k = 2
//输出:"ps"
//
//
//
//
// 提示:
//
//
// 1 <= s.length <= 10^5
// 2 <= k <= 10^4
// s 中只含有小写英文字母。
//
// Related Topics 栈
// 👍 88 👎 0
package leetcode.editor.cn;
import java.util.Stack;
//1209:删除字符串中的所有相邻重复项 II
public class RemoveAllAdjacentDuplicatesInStringIi {
public static void main(String[] args) {
//测试代码
Solution solution = new RemoveAllAdjacentDuplicatesInStringIi().new Solution();
//abcd
System.out.println(solution.removeDuplicates("abcd", 2));
//aa
System.out.println(solution.removeDuplicates("deeedbbcccbdaa", 3));
//ps
System.out.println(solution.removeDuplicates("pbbcggttciiippooaais", 2));
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String removeDuplicates(String s, int k) {
int size = 1;
Stack<Character> stack = new Stack<>();
for (char ch : s.toCharArray()) {
if (!stack.isEmpty() && stack.peek() == ch) {
size++;
if (size == k) {
while (size > 1) {
stack.pop();
size--;
}
if (!stack.isEmpty()) {
Stack<Character> temp = new Stack<>();
temp.push(stack.pop());
while (!stack.isEmpty() && stack.peek().equals(temp.peek())) {
temp.push(stack.pop());
size++;
}
while (!temp.isEmpty()) {
stack.push(temp.pop());
}
}
} else {
stack.push(ch);
}
} else {
stack.push(ch);
size = 1;
}
}
StringBuilder sBuilder = new StringBuilder();
while (!stack.isEmpty()) {
sBuilder.insert(0, stack.pop());
}
s = sBuilder.toString();
return s;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}