Golang 查找字符串的所有子集
Golang中的字符串是一组字符。由于Go中的字符串是不可变的,在产生后就无法修改。但是,可以通过将字符串连接或添加到现有字符串中来创建新的字符串。作为Go中的内置类型,字符串类型可以像任何其他数据类型一样以各种方式使用。
步骤
- 第1步 - 在程序中创建一个包main,并声明fmt(格式化包)和sort(排序包)。其中,main生成可执行代码,fmt用于格式化输入和输出。
-
第2步 - 创建一个main函数,在该函数中创建一个字符串,并使用Golang的打印语句将其打印到控制台上。
-
第3步 - 从控制台调用subset_string函数,并将字符串作为输入传递给它。
-
第4步 - 在函数中,首先将一个名为size的变量初始化为输入字符串的长度。
-
第5步 - 然后,通过外部循环迭代0到2(size)-1之间的所有整数,其中每个整数的每一位都对应于输入字符串中的一个字符。
-
第6步 - 在内部循环中,检查当前整数I的第j位。如果第j位设置为1,则输入字符串的第j个字符是当前子集的一部分。
-
第7步 - 然后将字符添加到子集中,并随后打印子集。
-
第8步 - 直到确定并打印出输入字符串的每个子集,外部循环都会继续执行。
-
第9步 - 使用fmt.Println()函数执行打印语句,其中ln表示换行。
-
第10步 - 该算法利用位操作的思想,通过迭代从0到2^size-1的所有整数,并检查每个位以确定在当前子集中包括哪些字符,从而生成输入字符串的所有可能的子集。
示例1
在此示例中,我们将了解如何使用位操作方法获取字符串的所有子集。
package main
import "fmt"
func subset_string(string_val string) {
size := len(string_val) //denotes length of input string
for i := 0; i < (1 << uint(size)); i++ {
subset := ""
for j := 0; j < size; j++ {
if i&(1<<uint(j)) != 0 {
subset += string(string_val[j])
}
}
fmt.Print(subset + " ") //subset is subsequently printed
}
}
func main() {
string_val := "rit" //Create a string
fmt.Println("The initial string created here is:", string_val)
fmt.Println("The subsets of the string created is:")
subset_string(string_val)
}
输出
The initial string created here is: rit
The subsets of the string created is:
r i ri t rt it rit
示例2
此示例使用了名为subsets的递归函数。
package main
import "fmt"
func subsets(mystr string, start int, subset string) {
fmt.Println(subset)
for i := start; i < len(mystr); i++ { //run a loop till the length of mystr
subsets(mystr, i+1, subset+string(mystr[i]))
}
}
func main() {
mystr := "rit" //Create string
fmt.Println("The original string created here is:", mystr)
subsets(mystr, 0, "") //call the function subsets with three arguments
}
输出
The original string created here is: rit
r
ri
rit
rt
i
it
t
结论
我们使用两个示例来执行查找字符串的所有子集的程序。在第一个示例中,我们使用了位操作方法,在第二个示例中,我们使用了递归方法来执行该程序。两个程序都给出了类似的子集输出。因此,程序成功执行。