leetcode_604 迭代压缩字符串

125 阅读1分钟

要求

对于一个压缩字符串,设计一个数据结构,它支持如下两种操作: next 和 hasNext。

给定的压缩字符串格式为:每个字母后面紧跟一个正整数,这个整数表示该字母在解压后的字符串里连续出现的次数。

  • next() - 如果压缩字符串仍然有字母未被解压,则返回下一个字母,否则返回一个空格。
  • hasNext() - 判断是否还有字母仍然没被解压。

注意:

请记得将你的类在 StringIterator 中 初始化 ,因为静态变量或类变量在多组测试数据中不会被自动清空。更多细节请访问 这里 。

示例:

StringIterator iterator = new StringIterator("L1e2t1C1o1d1e1");

iterator.next(); // 返回 'L'
iterator.next(); // 返回 'e'
iterator.next(); // 返回 'e'
iterator.next(); // 返回 't'
iterator.next(); // 返回 'C'
iterator.next(); // 返回 'o'
iterator.next(); // 返回 'd'
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 'e'
iterator.hasNext(); // 返回 false
iterator.next(); // 返回 ' '

核心代码

class StringIterator:
    def __init__(self, compressedString: str):
        self.char_freq = []
        n = len(compressedString)
        i = 0
        while i < n:
            c = compressedString[i]
            x = 0
            i += 1
            while i < n and compressedString[i].isdigit():
                x = x * 10 + int(compressedString[i])
                i += 1
            self.char_freq.append([c,x]) 

    def next(self) -> str:
        if not self.char_freq:
            return " "
        c,f = self.char_freq[0]
        if f == 1:
            self.char_freq.pop(0)
        else:
            self.char_freq[0][1] -= 1
        return c

    def hasNext(self) -> bool:
        return len(self.char_freq) != 0

# Your StringIterator object will be instantiated and called as such:
# obj = StringIterator(compressedString)
# param_1 = obj.next()
# param_2 = obj.hasNext()

image.png

解题思路:其实就是设置一个数据结构来对压缩字符串进行存储,在init方法中我们将每个字符和后面的数字同构成一个tuple,然后使用一个数据列表进行存储;next就是不断的获取压缩字符,当我们的字符的频率不是0的时候,我们的频率减1,然后我们的输出字符,当频率减为0的时候,我们将字符从数据列表中提取出来,最后的hasNext,就是看数据列表中是否还有数据。