在Python中计算同构子字符串的数量

在Python中计算同构子字符串的数量

假设我们有一个字符串s,我们必须找出s的同构子字符串的数量。答案可能非常大,因此返回答案取模10^9+7后的值。当字符串的所有字符都相同时,该字符串被称为同构字符串。

因此,如果输入为s =“xyyzzzxx”,则输出将为13,因为同构子字符串如下所示:

  • 1. “x”出现了三次。

  • “xx”出现了一次。

  • 3. “y”出现了两次。

  • “yy”出现了一次。

  • 5. “z”出现了三次。

  • “zz”出现了两次。

  • “zzz”出现了一次。

因此,(3 + 1 + 2 + 1 + 3 + 2 + 1) = 13。

要解决这个问题,我们将遵循以下步骤:

  • s:= s连接“@”

  • h:=一个新的映射

  • prev:=s [0]

  • c:= 1

  • 对于s中的每个i,从索引1到结束,执行以下操作

    • 如果prev不同于i,则
      • 如果prev * c在h中,则

      • h [prev * c]:= h [prev * c] +1

      • 否则,

      • h [prev * c]:= 1

      • c:= 1

    • 如果prev与i相同,则

      • c:= c + 1
    • prev:= i

  • fin:= 0

  • 对于h中的每个i,执行以下操作

    • t:= i的大小

    • k:= 0

    • while t不等于0,执行以下操作:

      • k:= k + t

      • t:= t – 1

    • fin:= fin + k * h [i]

  • 返回fin mod 10^9+ 7

示例

让我们看下面的实现以更好地理解:

def solve(s):
   s+="@"
   h={}
   prev=s[0]
   c=1
   for i in s[1:]:
      if prev!=i:
         if prev*c in h:
            h[prev*c]+=1
         else:
            h[prev*c]=1
         c=1
      if prev == i:
         c += 1
      prev = i
   fin=0
   for i in h:
      t=len(i)
      k=0
      while t!=0:
         k+=t
         t-=1
      fin+=k*h[i]
   return fin % 1000000007

s = "xyyzzzxx"
print(solve(s))

输入

“xyyzzzxx”

输出

13

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程