在C ++中删除字符串II中的所有相邻重复项

假设给出了字符串s,则ak重复删除包括从字符串s中选择k个相邻且相等的字母,然后删除它们,使删除的子字符串的左侧和右侧连接在一起。我们将在给定的字符串s上重复进行k次重复删除,直到无法更改任何剩余项为止。完成所有此类重复删除后,我们必须找到最终字符串。因此,如果输入类似于s =“ deeedbbcccbdaa”,且k = 3,则输出将为“ aa”,首先删除“ eee”和“ ccc”,我们将得到“ ddbbbaa”,然后删除“ bbb” ,字符串将是“ dddaa”,然后删除“ ddd”,输出将是“ aa”

为了解决这个问题,我们将遵循以下步骤-

  • ans:=空字符串

  • 为char-int对创建一个堆栈,n:=字符串的大小

  • 当我的范围是0到n

    • x:= s [i]

    • 如果堆栈不为空并且堆栈顶部元素的整数= k,则从堆栈中删除顶部元素

    • 如果i = n,则破坏

    • 如果堆栈为空或堆栈顶部的字符不是x,则将对(x,1)插入堆栈,并将i加1

    • 否则增加栈顶元素的整数部分,并将i增加1

  • 当堆栈不为空时

    • ans:= ans + temp的字符部分

    • 将温度的整数部分减少1

    • temp:=堆栈顶部元素

    • 虽然temp的整数部分不为0,

    • 从堆栈中删除顶部元素

  • 反转ans字符串并返回。

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string removeDuplicates(string s, int k) {
      string ans = "";
      stack < pair<char, int> > st;
      int n = s.size();
      for(int i = 0; i <= n;){
         char x = s[i];
         if(!st.empty() && st.top().second == k)st.pop();
         if(i == n)break;
         if(st.empty() || st.top().first != x){
            st.push({x, 1});
            i++;
         } else {
            st.top().second++;
            i++;
         }
      }
      while(!st.empty()){
         pair <char, int> temp = st.top();
         while(temp.second--) ans += temp.first;
         st.pop();
      }
      reverse(ans.begin(), ans.end());
      return ans;
   }
};
main(){
   Solution ob;
   cout <<(ob.removeDuplicates("deeedbbcccbdaa", 3));
}

输入项

"deeedbbcccbdaa"
3

输出结果

aa