5206. 删除字符串中的所有相邻重复项 II
显示英文描述
- 用户通过次数320
- 用户尝试次数393
- 通过次数323
- 提交次数642
- 题目难度Medium
给你一个字符串 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
中只含有小写英文字母。
思路:用栈模拟一下就可以了,辣鸡题
class Solution {
class node
{
char val;
int num;
public node(char val,int num)
{
this.val=val;
this.num=num;
}
}
public String removeDuplicates(String s, int k) {
Stack<node> st=new Stack();
for(int i=0;i<s.length();i++)
{
int tmp=0;
if(!st.isEmpty() && s.charAt(i)==st.peek().val)
tmp=st.peek().num+1;
else
tmp=1;
if(tmp==k)
{
int num=k-1;
while(num>0)
{
st.pop();
num--;
}
}
else
st.add(new node(s.charAt(i),tmp));
}
StringBuilder str1=new StringBuilder();
StringBuilder str2=new StringBuilder();
while(!st.isEmpty()) str1.append(st.pop().val);
for(int i=str1.length()-1;i>=0;i--)
str2.append(str1.charAt(i));
return str2.toString();
}
}