给你一个字符串 word
,请你使用以下算法进行压缩:
- 从空字符串
comp
开始。当word
不为空 时,执行以下操作:- 移除
word
的最长单字符前缀,该前缀由单一字符c
重复多次组成,且该前缀长度 最多 为 9 。 - 将前缀的长度和字符
c
追加到comp
。
- 移除
返回字符串 comp
。
示例 1:
输入:word = "abcde"
输出:"1a1b1c1d1e"
解释:
初始时,comp = ""
。进行 5 次操作,每次操作分别选择 "a"
、"b"
、"c"
、"d"
和 "e"
作为前缀。
对每个前缀,将 "1"
和对应的字符追加到 comp
。
示例 2:
输入:word = "aaaaaaaaaaaaaabb"
输出:"9a5a2b"
解释:
初始时,comp = ""
。进行 3 次操作,每次操作分别选择 "aaaaaaaaa"
、"aaaaa"
和 "bb"
作为前缀。
- 对于前缀
"aaaaaaaaa"
,将"9"
和"a"
追加到comp
。 - 对于前缀
"aaaaa"
,将"5"
和"a"
追加到comp
。 - 对于前缀
"bb"
,将"2"
和"b"
追加到comp
。
提示:
1 <= word.length <= 2 * 105
word
仅由小写英文字母组成。
思路:
按题意模拟即可。注意处理连续九个相同字符的特殊情况。
时间复杂度:O(N)
空间复杂度:O(1)
class Solution:
def compressedString(self, word: str) -> str:
if not word:
return word
prev_char = word[0]
cnt = 0
res = ""
for i in range(len(word)):
if word[i] != prev_char:
if cnt > 0:
res += str(cnt) + prev_char
cnt = 1
prev_char = word[i]
else:
cnt += 1
if cnt == 9:
res += "9" + prev_char
cnt = 0
return res + str(cnt) + prev_char if cnt > 0 else res