给定N个字符串,每个字符串全部由小写字母组成,且每个字符串的长度最多为8,重组字符串有以下规则: 1.从每个字符串里面都抽取1个字母组成 2.新字符串不能有2个相同的字母请问总共能组成多少个重组字符串 请写一段go程序判断有多少重组字符串
时间: 2023-05-30 12:04:22 浏览: 82
汇编输入256个以下个字符,将小写变大写,并统计字母个数,然后输入一个字符,响铃一次,输出该字符有多少个
5星 · 资源好评率100%
解题思路:
可以使用一个map来记录每个字母出现的次数,然后使用递归的方式来枚举所有可能的重组字符串,每次取出一个字母,并将其在map中的次数减1,然后递归进入下一层,最后将取出的字母放回map中即可。
代码如下:
```go
package main
import "fmt"
var ans int // 记录答案
func count(s string, m map[byte]int) {
for i := 0; i < len(s); i++ {
m[s[i]]++
}
}
func dfs(m map[byte]int, n int) {
if n == 0 {
ans++
return
}
for k := range m {
if m[k] > 0 {
m[k]--
dfs(m, n-1)
m[k]++
}
}
}
func main() {
var n int
fmt.Scan(&n)
strs := make([]string, n)
for i := 0; i < n; i++ {
fmt.Scan(&strs[i])
}
m := make(map[byte]int)
for i := 0; i < n; i++ {
count(strs[i], m)
}
dfs(m, n)
fmt.Println(ans)
}
```
时间复杂度:$O(26^n)$,其中$n$为字符串的个数。
阅读全文