给你一个字符串 s ,它包含一个或者多个单词。单词之间用单个空格 ' ' 隔开。
如果字符串 t 中第 i 个单词是 s 中第 i 个单词的一个 排列 ,那么我们称字符串 t 是字符串 s 的同位异构字符串。
- 比方说,
"acb dfe"是"abc def"的同位异构字符串,但是"def cab"和"adc bef"不是。
请你返回 s 的同位异构字符串的数目,由于答案可能很大,请你将它对 10^9 + 7 取余 后返回。
示例 1:
```txt
输入:s = "too hot"
输出:18
解释:输入字符串的一些同位异构字符串为 "too hot" ,"oot hot" ,"oto toh" ,"too toh" 以及 "too oht" 。
```
示例 2:
```txt
输入:s = "aa"
输出:1
解释:输入字符串只有一个同位异构字符串。
```
提示:
1 <= s.length <= 10^5s只包含小写英文字母和空格' '。相邻单词之间由单个空格隔开。
统计同位异构字符串数目
题目
给你一个字符串 s ,它包含一个或者多个单词。单词之间用单个空格 ' ' 隔开。
如果字符串 t 中第 i 个单词是 s 中第 i 个单词的一个 排列 ,那么我们称字符串 t 是字符串 s 的同位异构字符串。
- 比方说,
"acb dfe"是"abc def"的同位异构字符串,但是"def cab"和"adc bef"不是。
请你返回 s 的同位异构字符串的数目,由于答案可能很大,请你将它对 10^9 + 7 取余 后返回。
示例 1:
1 | 输入:s = "too hot" |
示例 2:
1 | 输入:s = "aa" |
提示:
-
1 <= s.length <= 10^5 -
s只包含小写英文字母和空格' '。 - 相邻单词之间由单个空格隔开。
题解
方法一:
思路
求出每个单词的多重全排列,然后根据乘法原理,累乘即可。
设第i个单词的字母a出现的次数为$a_i$
答案是$\prod \frac{(a_i+b_i+\cdots+z_i)!}{a_i!b_i!\cdots z_i!}$
我们可以预处理阶乘的逆元减小时间复杂度。
代码
1 | class Solution { |