leetcode:604. 迭代压缩字符串

题目来源

题目描述

在这里插入图片描述

class StringIterator{
public:
    StringIterator(string compressedString){
        
    }

    char next(){
        
    }

    bool hasNext(){
        
    }
private:
    
};

题目解析

分析

  • 这道题本质上是要我们根据压缩字符串来输出原字符串中的所有字符
  • 那么我们需要提取出每一个字符,以及它们的出现次数
  • 次数减1,如果减到0了,我们就要取出下一个字符和其出现的次数。

实现

class StringIterator{
public:
    StringIterator(string compressedString){
        s = compressedString;
        n = s.size();
        c = ' ';
        cnt = 0;
        i = 0;
    }

    char next(){
        if(hasNext()){
            --cnt;
            return c;
        }
        return ' ';
    }

    bool hasNext(){
        if (cnt > 0) return true;
        if (i >= n) return false;
        c = s[i++];
        while (i < n && s[i] >= '0' && s[i] <= '9') {
            cnt = cnt * 10 + s[i++] - '0';
        }
        return true;
    }
private:
    std::string s;  // 保存原字符串
    int n, i, cnt;  // i来记录当前遍历到的位置,变量c为当前处理的字符,变量cnt为字符c的当前次数
    char c;
};

C++中的字符流类来处理字符串:

class StringIterator{
public:
    StringIterator(string compressedString){
        is = istringstream (compressedString);
        cnt = 0;
        c = ' ';
    }

    char next(){
        if (hasNext()) {
            --cnt;
            return c;
        }
        return ' ';
    }

    bool hasNext(){
        if(cnt == 0){
            is >> c >> cnt;
        }
        return cnt > 0;
    }
private:
    istringstream  is;
    int cnt;
    char c;
};

下面这种解法还是用字符流类,和上面方法不同的地方是,在构建函数中完成了所有字符和次数的拆分:

class StringIterator {
public:
    StringIterator(string compressedString) {
        istringstream is(compressedString);
        int cnt = 0;
        char c = ' ';
        while (is >> c >> cnt) {
            q.push({c, cnt});
        }
    }
    
    char next() {
        if (hasNext()) {
            auto &t = q.front();
            if (--t.second == 0) q.pop();
            return t.first;
        }
        return ' ';
    }
    
    bool hasNext() {
        return !q.empty();
    }

private:
    queue<pair<char, int>> q;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值