สมมติว่าสตริง 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