【C++刷题】力扣-#604-迭代压缩字符串

题目描述

设计一个迭代器,用于遍历一个压缩字符串,该字符串由字符和数字组成,其中数字表示字符的重复次数。例如,字符串 “a2bc3” 表示 “abcbc”。

功能要求:

  1. next():返回下一个字母,并向前移动迭代器。
  2. hasNext():返回迭代器是否还有更多的字母。

示例

输入: compressedString = "a2bc3"

  • next() 返回 ‘a’
  • next() 返回 ‘a’
  • hasNext() 返回 true
  • next() 返回 ‘b’
  • next() 返回 ‘b’
  • next() 返回 ‘c’
  • hasNext() 返回 true
  • next() 返回 ‘c’
  • next() 返回 ‘c’
  • hasNext() 返回 false

题解

为了解决这个问题,我们需要实现一个迭代器,它能够处理压缩字符串中的字符和数字。迭代器需要支持两个操作:next()hasNext()

算法设计:

  1. 使用一个字符串来存储压缩字符串。
  2. 使用两个指针,一个用于指向当前字符,另一个用于指向当前字符的重复次数。
  3. next() 方法中,首先检查是否有剩余的字符,如果有,则返回当前字符,并更新指针。
  4. hasNext() 方法中,检查指针是否已经到达字符串的末尾。

代码实现

class CompressedStringIterator {
private:
    string compressedString;
    int index;
    int repeatCount;

public:
    CompressedStringIterator(const string& compressedString) 
        : compressedString(compressedString), index(0), repeatCount(0) {}

    char next() {
        if (!hasNext()) {
            throw range_error("No more elements");
        }

        if (repeatCount == 0) {
            char currentChar = compressedString[index++];
            while (index < compressedString.length() && isdigit(compressedString[index])) {
                repeatCount = repeatCount * 10 + (compressedString[index++] - '0');
            }
            repeatCount--; 
            return currentChar;
        } else {
            repeatCount--;
            return compressedString[index - 1]; 
        }
    }

    bool hasNext() {
        return repeatCount > 0 || index < compressedString.length();
    }
};

复杂度分析

  • 时间复杂度: O(1),对于每次 next()hasNext() 操作,我们只需要常数时间来处理当前字符和重复次数。
  • 空间复杂度: O(1),我们只需要常数空间来存储当前字符和重复次数。
    这个实现满足了题目的要求,可以正确地遍历压缩字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值