字符串子序列
func process1(str string, index int, ans *[]string, path string) {
if index == len(str) {
*ans = append(*ans, path)
return
}
process1(str, index+1, ans, path)
process1(str, index+1, ans, path+string(str[index]))
}
字符串去重子序列
func process2(str string, index int, ans map[string]struct{}, path string) {
if index == len(str) {
if _, ok := ans[path]; !ok {
ans[path] = struct{}{}
}
return
}
process2(str, index+1, ans, path)
process2(str, index+1, ans, path+string(str[index]))
}
字符串全排列
func process3(str []byte, index int, ans *[]string) {
if index == len(str) {
*ans = append(*ans, string(str))
} else {
for i := index; i < len(str); i++ {
str[index], str[i] = str[i], str[index]
process3(str, index+1, ans)
str[i], str[index] = str[index], str[i]
}
}
}
字符串去重全排列
func process4(str []byte, index int, ans *[]string) {
if index == len(str) {
*ans = append(*ans, string(str))
} else {
visited := [256]bool{}
for i := index; i < len(str); i++ {
if visited[str[i]] {
continue
}
visited[str[i]] = true
str[index], str[i] = str[i], str[index]
process4(str, index+1, ans)
str[i], str[index] = str[index], str[i]
}
}
}