3 回答
TA贡献1891条经验 获得超3个赞
如果这些词的有效性没有得到任何考虑,那么最好放弃“字谜”这个词。你只是在问排列。有一个用于解释重复项的排列公式:
对于一个长度的单词,取排列的基数,即 。然后,对于单词中的每个唯一字母,计算该字母的出现次数。对于这些字母中的每一个,取出现次数的阶乘,并将排列数除以它。nn!
对于“地狱”:
n = 6
h = 1, e = 1, l = 3, o = 1
Permutations = 6! / (1! x 1! x 3! x 1!)
= 720 / 6
= 120
TA贡献1824条经验 获得超6个赞
法典:
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("Enter word: ")
scanner.Scan()
word := scanner.Text()
anagrams := factorial(len(word))
chars := strings.Split(word, "")
word1 := word
n := 0
for i := 0; i < len(word); i++ {
n = strings.Count(word1, chars[i])
if n > 0 {
anagrams = anagrams / factorial(n)
word1 = strings.Replace(word1, chars[i], "", -1)
}
}
fmt.Println(anagrams)
}
func factorial(n int) int {
factorial := 1
for i := n; i > 0; i-- {
factorial = i * factorial
}
return factorial
}
结果:
aab -> 3
helo -> 24
hello -> 60
helllo -> 120
TA贡献1785条经验 获得超4个赞
您可以使用一些组合。首先计算每个字符的出现次数。然后使用牛顿符号,您将每个字符放在其位置上。例如给定的单词
aabcdee
你有7个地方可以放置单个字母,你有重复的 - 双a和双e.
所以你使用这个公式
,你可以放在7个地方中的2个,然后你可以乘以你可以放置b的地方的数量 - 5个剩余地方中的1个。然后在1/4上。然后在1/3上。然后在2/2上。
将这些公式中的每一个相乘都会得到线性时间内的字谜数(如果使用哈希图进行字母计数)。a
c
d
e
- 3 回答
- 0 关注
- 77 浏览
添加回答
举报