leetcode_1933 判断字符串是否可分解为值均等的子串

140 阅读1分钟

要求

一个字符串的所有字符都是一样的,被称作等值字符串。

  • 举例,"1111" 和 "33" 就是等值字符串。
  • 相比之下,"123"就不是等值字符串。 规则:给出一个数字字符串s,将字符串分解成一些等值字符串,如果有且仅有一个等值子字符串长度为2,其他的等值子字符串的长度都是3.

如果能够按照上面的规则分解字符串s,就返回真,否则返回假。

子串就是原字符串中连续的字符序列。

示例 1:

输入: s = "000111000"
输出: false
解释:  s只能被分解长度为3的等值子字符串。

示例 2:

输入: s = "00011111222"
输出: true
解释: s 能被分解为 ["000","111","11","222"].

示例 3:

输入: s = "01110002223300"
输出: false
解释: 一个不能被分解的原因是在开头有一个0.

提示:

  • 1 <= s.length <= 1000
  • s 仅包含数字。

核心代码

class Solution:
    def isDecomposable(self, s: str) -> bool:
        res = [len(list(g))%3 for e, g in groupby(s)]
        return sum(res)==2 and 1 not in res

image.png

解题思路:主要是groupby的使用

s = "000111000"
for e,g in groupby(s):
    print(e,list(g))
   
0 ['0', '0', '0'] 
1 ['1', '1', '1']
0 ['0', '0', '0']

我们可以统计出来每个字符的个数,然后对3进行取余,只有一个2的机会,并且在res的统计列表中不允许1的存在,比较有意思的一道题。