Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ลบรายการที่ซ้ำกันทั้งหมดใน String II ใน C ++


สมมติว่าสตริง s ได้รับ การลบซ้ำ k ประกอบด้วยการเลือก k ตัวอักษรที่อยู่ติดกันและเท่ากับจากสตริง s และการลบออกทำให้ด้านซ้ายและด้านขวาของสตริงย่อยที่ถูกลบเชื่อมต่อเข้าด้วยกัน เราจะทำการลบซ้ำ k ครั้งในสตริงที่กำหนด s จนกว่าเราจะไม่สามารถเปลี่ยนแปลงส่วนที่เหลือได้ เราต้องหาสตริงสุดท้ายหลังจากลบที่ซ้ำกันทั้งหมดแล้ว ดังนั้นหากอินพุตเป็น s =“deeedbbcccbdaa” และ k =3 ผลลัพธ์จะเป็น “aa” ในตอนแรกให้ลบ “eee” และ “ccc” แล้วเราจะได้ “ddbbbaa” จากนั้นให้ลบ “bbb” สตริงจะเป็น "dddaa" จากนั้นลบ "ddd" และผลลัพธ์จะเป็น "aa"

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ตอบ :=สตริงว่าง
  • สร้างหนึ่งสแต็กสำหรับคู่อักขระ n :=ขนาดของสตริง
  • สำหรับฉันอยู่ในช่วง 0 ถึง n
    • x :=s[i]
    • ถ้า stack ไม่ว่างและเป็นจำนวนเต็มของ stack top element =k ให้ลบองค์ประกอบด้านบนออกจาก stack
    • ถ้า i =n ก็แตก
    • ถ้า stack ว่างเปล่าหรือตัวอักษรของ stack top ไม่ใช่ x ให้ใส่คู่ (x, 1) เข้าไปใน stack และเพิ่ม i ขึ้น 1
    • มิฉะนั้น ให้เพิ่มส่วนจำนวนเต็มขององค์ประกอบบนสุดของสแต็ก และเพิ่ม i ขึ้น 1
  • ในขณะที่สแต็กไม่ว่างเปล่า
    • temp :=stack องค์ประกอบบนสุด
    • ในขณะที่ส่วนจำนวนเต็มของ temp ไม่ใช่ 0,
      • ans :=ans + ส่วนอักขระของอุณหภูมิ
      • ลดส่วนจำนวนเต็มของอุณหภูมิลง 1
    • ลบองค์ประกอบด้านบนออกจากสแต็ก
  • ย้อนกลับสตริง 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