604. 迭代压缩字符串 🔒
题目描述
设计并实现一个迭代压缩字符串的数据结构。给定的压缩字符串的形式是,每个字母后面紧跟一个正整数,表示该字母在原始未压缩字符串中出现的次数。
设计一个数据结构,它支持如下两种操作: next
和 hasNext
。
next()
- 如果原始字符串中仍有未压缩字符,则返回下一个字符,否则返回空格。hasNext()
- 如果原始字符串中存在未压缩的的字母,则返回true,否则返回false
。
示例 1:
输入: ["StringIterator", "next", "next", "next", "next", "next", "next", "hasNext", "next", "hasNext"] [["L1e2t1C1o1d1e1"], [], [], [], [], [], [], [], [], []] 输出: [null, "L", "e", "e", "t", "C", "o", true, "d", true] 解释: StringIterator stringIterator = new StringIterator("L1e2t1C1o1d1e1"); stringIterator.next(); // 返回 "L" stringIterator.next(); // 返回 "e" stringIterator.next(); // 返回 "e" stringIterator.next(); // 返回 "t" stringIterator.next(); // 返回 "C" stringIterator.next(); // 返回 "o" stringIterator.hasNext(); // 返回 True stringIterator.next(); // 返回 "d" stringIterator.hasNext(); // 返回 True
提示:
1 <= compressedString.length <= 1000
compressedString
由小写字母、大写字母和数字组成。- 在
compressedString
中,单个字符的重复次数在[1,10 ^9]
范围内。 next
和hasNext
的操作数最多为100
。
解法
方法一:解析存储
将 compressedString
解析成字符 $c$ 和对应的重复次数 $x$,存储在数组或列表 $d$ 中,用 $p$ 指向当前字符。
然后在 next
和 hasNext
中进行操作。
初始化的时间复杂度为 $O(n)$,其余操作的时间复杂度为 $O(1)$。其中 $n$ 为 compressedString
的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|