在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
- 如果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