Leetcode分割字符串的方案数

在这里插入图片描述
我的解法:
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值