在 Go 中生成所有可能的 n 字符密码
使用 Go 中给定集合中的字符生成指定长度的所有可能的密码,需要用到n元笛卡尔积的概念。本质上,这涉及构建一个集合与其自身 n 次的笛卡尔积。
该方法是迭代的。首先构造 n-1 笛卡尔积。然后,对于每个产品和初始集合的每个元素,该元素被添加到产品中。例如,考虑使用字符 'a' 和 'b' 生成所有 3 字符密码:
下面的 Go 函数 NAryProduct 实现了这个迭代构造:
import ( "fmt" "strings" ) func NAryProduct(input string, n int) []string { if n <= 0 { return nil } prod := make([]string, len(input)) for i, char := range input { prod[i] = string(char) } for i := 1; i < n; i++ { next := make([]string, 0, len(input)*len(prod)) for _, word := range prod { for _, char := range input { next = append(next, word + string(char)) } } prod = next } return prod }
示例用法:
fmt.Println(NAryProduct("abc", 3)) // [aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc]
请注意,所提供的解决方案可以通过避免重新计算先前计算的集合来进一步优化。
以上是如何在 Go 中生成所有可能的 n 字符密码?的详细内容。更多信息请关注PHP中文网其他相关文章!