力扣3703. 移除K-平衡子字符串



这一题的大意是说给出一个只有’(‘和’)'的字符串,现在如果k 个 连续 的 ‘(’ 后面跟着 k 个 连续 的 ‘)’,即 ‘(’ * k + ‘)’ * k 称为k平衡
那么就让这样的子串移除,把所有的k平衡的子串移除后,返回剩下的字符串。
很明显是邻项匹配,那么就会涉及到栈,因为需要出现k次才能消除,因此我们需要记录一个字符出现的次数,需要用到pair
当涉及到栈的问题的时候,我们会默认用stack这个stl来解决,但实际上用vector模拟栈是更好的,因为vector支持随机访问。可以随时对每一个元素进行修改和拿取。
因此我们只需要用栈的方式存储元素,直到遇到符合条件的情况:
当一个元素是’)‘并且它出现的次数==k,并且在它前面的栈中的元素是’('并且‘(’出现的次数>=k,那么就符合匹配可以删除了。
完整代码如下:
class Solution {
public:typedef pair<char,int> pii;string removeSubstring(string s, int k) {vector<pii> st;int cnt=1;string ans;for(int i=0;i<s.size();i++){if(i==0){st.push_back({s[i],cnt}); }else{if(!st.empty()&&s[i]==st.back().first){st.back().second++;}else{st.push_back({s[i],cnt});}}if(st.back().first==')'&&st.back().second==k){if(st.size()>=2){if(st.size()>=2&&st[st.size()-2].first=='('&&st[st.size()-2].second>=k){//说明可以相除st.pop_back();if(st.back().second!=k)st.back().second=st.back().second-k;elsest.pop_back();}}}}for(int i=0;i<st.size();i++){for(int j=0;j<st[i].second;j++){ans+=st[i].first;}}return ans;}
};
时间复杂度O(n)
总结:在涉及到栈的时候并不一定要用到stack,用vector模拟栈更方便。‘当涉及出现多次是,用pair来表示栈元素。
