前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1209. 删除字符串中的所有相邻重复项 II(栈)

LeetCode 1209. 删除字符串中的所有相邻重复项 II(栈)

作者头像
Michael阿明
发布2020-07-13 16:21:15
1.2K0
发布2020-07-13 16:21:15
举报

1. 题目

给你一个字符串 s,「k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。

你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。

在执行完所有删除操作后,返回最终得到的字符串。

本题答案保证唯一。

代码语言:javascript
复制
示例 1:
输入:s = "abcd", k = 2
输出:"abcd"
解释:没有要删除的内容。

示例 2:
输入:s = "deeedbbcccbdaa", k = 3
输出:"aa"
解释: 
先删除 "eee" 和 "ccc",得到 "ddbbbdaa"
再删除 "bbb",得到 "dddaa"
最后删除 "ddd",得到 "aa"

示例 3:
输入:s = "pbbcggttciiippooaais", k = 2
输出:"ps"
 
提示:
1 <= s.length <= 10^5
2 <= k <= 10^4
s 中只含有小写英文字母。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 栈解题

  • 将当前字符和其连续的个数存入栈中
  • 个数达到 k 时出栈 k 个
代码语言:javascript
复制
class Solution {
public:
    string removeDuplicates(string s, int k) {
        int i, count = 0;
        stack<pair<char,int>> stk;
        char prev = '*';
        for(i = 0; i < s.size(); ++i)
        {
        	if(prev != s[i])
        	{
        		count = 1;
        		stk.push(make_pair(s[i],count));
        		prev = s[i];
        	}
        	else//prev == s[i]
        	{
        		count = stk.top().second + 1;
        		stk.push(make_pair(s[i],count));
        		prev = s[i];
        		if(count == k)
        		{
        			while(count--)
        				stk.pop();
        			if(!stk.empty())
        				prev = stk.top().first;
        			else
        				prev = '*';
        		}
        	}
        }
        string ans;
        while(!stk.empty())
        {
        	ans += stk.top().first;
        	stk.pop();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};
在这里插入图片描述
在这里插入图片描述
  • 优化上面程序:相同的不必压栈了,直接改pair的second计数+1,减少压栈,弹栈时间
代码语言:javascript
复制
class Solution {
public:
    string removeDuplicates(string s, int k) {
        int i, count = 0;
        stack<pair<char,int>> stk;
        char prev = '*';
        for(i = 0; i < s.size(); ++i)
        {
            if(prev != s[i])
            {
                count = 1;
                stk.push(make_pair(s[i],count));
                prev = s[i];
            }
            else//prev == s[i]
            {
                stk.top().second++;//直接+1
                if(stk.top().second == k)
                {
                    stk.pop();
                    if(!stk.empty())
                        prev = stk.top().first;
                    else
                        prev = '*';
                }
            }
        }
        string ans;
        while(!stk.empty())
        {
            count = stk.top().second; 
            while(count--)   
                ans += stk.top().first;
            stk.pop();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 栈解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档