Go语言程序计算字符串的所有排列


在 Go 编程语言中,字符串是一种内置数据类型,表示字符序列。它们用双引号 (") 定义,可以包含任何有效的 Unicode 字符。字符串的排列是指具有相同字符但字符顺序不同的不同字符串。例如,“abcd”和“dabc”是彼此的排列。在本程序中,我们将探讨查找字符串排列并使用 Go 语言中的打印语句在控制台上打印输出的方法。

语法

func append(slice, element_1, element_2…, element_N) []T

append 函数用于向数组切片添加值。它接受多个参数。第一个参数是要向其中添加值的数组,后面跟着要添加的值。然后,该函数返回包含所有值的最终数组切片。

func len(v Type) int

len() 函数用于获取任何参数的长度。它将一个参数作为我们要查找其长度的数据类型变量,并返回一个整数,即变量的长度。

算法

  • 步骤 1 − 创建一个 package main 并声明程序中的 fmt(格式包),其中 main 生成可执行示例,fmt 帮助格式化输入和输出。

  • 步骤 2 − 主函数将输入列表、其长度和指向包含排列的整数切片数组的指针传递给 heapPermutation 函数。

  • 步骤 3 − heapPermutation 函数验证列表的长度是否为 1。如果是,则我们已经固定了列表的所有组件,使当前列表成为一个排列。因此,它将当前列表添加到排列切片中。

  • 步骤 4 − 如果列表的长度大于 1,则函数进入一个循环,在该循环中它不断地调用自身,其中包含列表的 n-1 个条目。

  • 步骤 5 − 使用嵌套循环,列表的最后一个元素与前面每个组件交换。

  • 步骤 6 − 然后,函数将当前排列添加到排列切片中。

  • 步骤 7 − 然后,函数使用 if 语句确定列表的长度是偶数还是奇数。如果是奇数,它将交换第一个元素和最后一个元素;如果是偶数,它将交换第 i 个索引处的元素和最后一个元素。

  • 步骤 8 − 此后,函数对列表中的每个元素重复上述过程。

  • 步骤 9 − 生成所有可能的排列后,函数返回排列切片。

  • 步骤 10 − 使用 fmt.Println() 函数打印控制台上的排列,其中 ln 表示换行。

  • 步骤 11 − 此方法的时间复杂度为 O(n!),因为长度为 n 的列表有 n! 个排列。由于所有排列都必须存储在切片中,因此空间复杂度也是 O(n!)。由于其非递归特性,对于大型输入,此策略可能比递归方法更有效,因为它可以防止堆栈溢出错误。

示例

这里我们使用 Heap 算法创建给定列表的所有按字典顺序排列的排列。

package main
import (
   "fmt"
)

func heapPermutation(mystr []int, n int, permutations *[][]int) {
   if n == 1 {
      *permutations = append(*permutations, append([]int{}, mystr...))
      return
   }
   for i := 0; i < n; i++ {   //calculate the permutation using heap
      heapPermutation(mystr, n-1, permutations)
      if n%2 == 0 {
         mystr[i], mystr[n-1] = mystr[n-1], mystr[i]
      } else {
         mystr[0], mystr[n-1] = mystr[n-1], mystr[0]
      }
   }
}

func main() {
   mystr := []int{10, 20, 30}  //create a slice with numbers whose permutation is to be calculated 
   fmt.Println("The elements of string are:", mystr)
   permutations := [][]int{}
   heapPermutation(mystr, len(mystr), &permutations)
   fmt.Println("The permutations of string presented here is:")
   fmt.Println(permutations)  //print the permutations 
}

输出

The elements of string are: [10 20 30]
The permutations of string presented here is:
[[10 20 30] [20 10 30] [30 10 20] [10 30 20] [20 30 10] [30 20 10]]

结论

我们使用一个示例执行了查找字符串排列的程序。在特定示例中,我们使用堆算法来执行执行。程序给出了预期的输出。

更新于:2023年2月20日

712 次浏览

开启你的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.