我的解法:
1.考虑特殊情况,没有3的倍数的1可以直接返回,只有0的情况直接返回c(n-1),2
2.如果可以分割,那么分割的方案数取决于1之间0的个数
比如一共有3个1,那么方案数=(第一个1到第二个1之间0个数+1)*(第二个1到第三个1之间0个数+1)
class Solution:
def numWays(self, s: str) -> int:
one_num=s.count("1")
if one_num%3!=0:
return 0
k=1e9+7
s_len=len(s)
if one_num==0:
ans=(s_len-1)*(s_len-2)/2
return int(ans%k)
one_count=0
zero_count=0
left_zero=0
pointer=0
while(one_count<=one_num//3):
if s[pointer]=='1':
one_count+=1
left_zero=zero_count
zero_count=0
else:
zero_count+=1
pointer+=1
pointer=s_len-1
one_count=0
zero_count=0
right_zero=0
while(one_count<=one_num//3):
if s[pointer]=='1':
one_count+=1
right_zero=zero_count
zero_count=0
else:
zero_count+=1
pointer-=1
return int((left_zero+1)*(right_zero+1)%k)
标准解法:
用split和len来代替查找0个数的操作
class Solution:
def numWays(self, s: str) -> int:
MOD = 1000000007
temp_arr = s.split("1")
num_1 = len(temp_arr) - 1
if num_1 % 3:
return 0
num_1 //= 3
if not num_1:
n = len(s)
return ((n-1)*(n-2)//2) % MOD
return ((len(temp_arr[num_1]) + 1) * (len(temp_arr[2*num_1])+1)) % MOD