题解49 | #去除所有重复字母#

去除重复字母

https://www.nowcoder.com/practice/67bf02ee92304e1f822d12742cec0725

注意区别:题解30 | 连续重复的东西总会被消除#点击消除#https://www.nowcoder.com/discuss/536957728435064832

#include <iterator>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param str string字符串
     * @return string字符串
     */
        string removeDuplicateLetters(string str) {
            vector<bool> vis(26, false); // 记录每个字母是否出现过
            vector<int> count(26, 0); // 记录每个字母的出现次数

            for (char ch : str) {
                count[ch - 'a']++;
            }

            string ans; // 结果字符串

            for (char ch : str) {

                count[ch - 'a']--; // 当前字母出现次数减1

                if (vis[ch - 'a']) { // 如果当前字母已经在结果字符串中出现过,则直接跳过
                    continue;
                }
                //如果当前字母比结果字符串的最后一个字母小,并且最后一个字母在后面还会出现,
                //则将最后一个字母从结果字符串中移除
                while (!ans.empty() && ch < ans.back() && count[ans.back() - 'a'] > 0) {
                    vis[ans.back() - 'a'] = false;
                    ans.pop_back();
                }
                ans.push_back(ch); // 将当前字母加入结果字符串中
                vis[ch - 'a'] = true; // 标记当前字母已经出现过
            }

            return ans;
        }
    
};

基本算法思想:

1. 首先统计每个字母在字符串中出现的次数,并记录每个字母是否已经出现过。

2. 遍历字符串中的每个字母,如果当前字母已经在结果字符串中出现过,则直接跳过。

3. 如果当前字母比结果字符串的最后一个字母小,并且最后一个字母在后面还会出现,则将最后一个字母从结果字符串中移除。

4. 将当前字母加入结果字符串中,并标记当前字母已经出现过。

5. 返回结果字符串。

时间复杂度:

O(n),其中n为字符串的长度,需要遍历字符串两次。

空间复杂度:

O(1),使用了常数个额外空间。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

Aki-Tomoya:窝趣,人家这是先富带动后富,共同富裕了属于是
投递英伟达等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务