C++ 中移除字串中所有相鄰重複字元 II
假設給定一個字串 s,k 次重複移除包括從字串 s 中選擇 k 個相鄰且相等的字母並將其移除,導致已刪除子字串的左側和右側連線在一起。我們將對給定的字串 s 重複進行 k 次重複移除,直到我們無法進行任何更改。我們必須找到所有此類重複移除後最終的字串。因此,如果輸入類似於 s = “deeedbbcccbdaa”,k = 3,則輸出將是 “aa”,首先刪除 “eee” 和 “ccc”,我們將得到 “ddbbbaa”,然後刪除 “bbb”,字串將是 “dddaa”,然後刪除 “ddd”,輸出將是 “aa”
為了解決這個問題,我們將遵循以下步驟:
- ans := 空字串
- 建立一個字元-整數對的棧,n := 字串的大小
- 對於 i 從 0 到 n
- x := s[i]
- 如果棧不為空且棧頂元素的整數部分 = k,則從棧中刪除頂元素
- 如果 i = n,則中斷
- 如果棧為空或棧頂的字元不是 x,則將對 (x, 1) 插入到棧中,並將 i 增加 1
- 否則增加棧頂元素的整數部分,並將 i 增加 1
- 當棧不為空時
- temp := 棧頂元素
- 當 temp 的整數部分不為 0 時
- ans := ans + temp 的字元部分
- 將 temp 的整數部分減少 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
廣告