在Python中查找拆分字符串的方法

在Python中查找拆分字符串的方法

假设我们有一个二进制字符串s,我们可以将s拆分成3个非空字符串s1、s2、s3,使得(s1连接s2连接s3=s)。我们必须找到将s拆分为s1、s2和s3的方法,使得s1、s2和s3中字符’1’的数量相同。答案可能非常大,因此返回答案mod 10^9+7。

因此,如果输入为s=”11101011″,则输出将为2,因为我们可以将它们拆分为”11 | 1010 | 11″和”11 | 101 | 011″。

为了解决这个问题,我们将按照以下步骤进行:

  • count:=计算s中1的数量
  • m:=10^9 + 7
  • ans := 大小为2的数组,并将其填充为0
  • 如果count mod 3与0不同,则
    • 返回0
  • 否则,当count等于0时,则
    • 返回(组合数nCr,其中n是s的大小-1,r是2)mod m
  • left:=0
  • right:=s的大小-1
  • cum_s:=0,cum_e := 0
  • 当cum_s ≤ count/3或cum_e ≤ count/3时,
    • 如果s[left]与”1″相同,则
      • cum_s:=cum_s+1
    • 如果s[right]与”1″相同,则
      • cum_e:=cum_e+1
    • 如果cum_s与count/3相同,则
      • ans[0]:=ans[0]+1
    • 如果cum_e与count/3相同,则
      • ans[1]:=ans[1]+1
    • left:=left+1
    • right:=right-1
  • 返回(ans[0]*ans[1]) mod m

下面是Python的实现代码以更好地理解:

示例

def solve(s):
   count = s.count("1")
   m = 10**9 + 7
   ans = [0, 0]
   if count % 3 != 0:
      return 0
   elif count == 0:
      return comb(len(s)-1,2) % m
   left = 0
   right = len(s)-1
   cum_s = 0
   cum_e = 0
   while(cum_s <= count//3 or cum_e <= count//3):
      if s[left] == "1":
         cum_s+=1
      if s[right] == "1":
         cum_e+=1
      if cum_s == count//3:
         ans[0]+=1
      if cum_e == count//3:
         ans[1]+=1
      left += 1
      right -= 1
   return (ans[0]*ans[1]) % m

s = "11101011"
print(solve(s))

输入

"11101011"

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程